ViewData 的替代品?
Posted
技术标签:
【中文标题】ViewData 的替代品?【英文标题】:Alternatives to ViewData? 【发布时间】:2011-01-10 17:58:19 【问题描述】:我对 MVC、ASP.net 以及一般的服务器端脚本非常陌生。
我在 www.asp.net/mvc 上观看了一个教程视频,该视频的人正在解释一个模板。他解释说控制器使用 viewdata 向视图发送信息。
如果我错了,请纠正我,但我相信它是这样使用的:
控制器:ViewData["PropertyName"] = value;
查看:<p><%= ViewData["PropertyName"] %></p>
这是正确的用法吗?
与使用 ViewData 相比,有什么更好的方法来做到这一点,它有什么不好的地方?
【问题讨论】:
您真的应该在每个帖子中坚持一个问题。我会将“如何使用 html.Encode()”问题移至一个单独的问题,因为它与原始问题无关。 【参考方案1】:在很多视图情况下,我会提倡使用 ViewData 集合。
在大多数情况下,我会为每个视图使用 Strongly Typed Views 和单独的 View Models。
【讨论】:
【参考方案2】:与使用 ViewData 相比,更好的方法是创建一个新的 Model 对象并将其传递给对 Model 进行强类型化的 View。
模型 (Models/MyModels.cs)
public class MyModel
public string PropertyName get; set;
查看(查看/我的/Index.aspx)
<%@ Page Language="C#" Inherits="ViewPage<MyModel>" %>
<p><%=Model.PropertyName %></p>
控制器 (Controllers/MyController.cs)
public class MyController : Controller
public ActionResult Index()
MyModel model = new MyModel()
PropertyName = "My Property Name"
;
return View(model);
Html.Encode 可以这样使用:
<%=Html.Encode(someObject) %>
或者如果你是using ASP.NET 4.0
<%: someObject %>
【讨论】:
我假设您的意思是<%=model.PropertyName %>
而不是 <%=Model.PropertyName %>
?【参考方案3】:
Justin 关于 ViewData 的使用以及 View Models 的使用是正确的(这绝对是最适合您需求的解决方案)。
Session
是另一种选择,但它往往是一个滑坡,但您确实要求提供替代方案。
【讨论】:
【参考方案4】:ViewData 适用于您不确定自己需要什么的完整随机数据。
如果您正在构建定义明确的视图,您将希望使用强类型视图。这些让您的视图继承自特定的业务对象(或者,更有用的是,一个 ViewModel)来显示数据。在这种情况下,您可以访问强类型模型成员,即 Model.SomeProperty,而不是 ViewData["SomeProperty"]。
此外,Html.Encode 旨在用于重复用户输入数据的数据元素。这是为了防止 HTML 注入。
【讨论】:
以上是关于ViewData 的替代品?的主要内容,如果未能解决你的问题,请参考以下文章