在ASP.NET MVC中,您可以随时使用ViewBag
,ViewData
和TempData
(有关更多信息,请参阅this blog post)。 ViewBag
是围绕ViewData
字典的动态封装。如果你这样做ViewBag.Prop = "value"
它相当于ViewData["Prop"] = "value"
。当您在视图中使用Model
媒体资源时,您正在检索ViewData.Model
。寻找自己:
public abstract class WebViewPage<TModel> : WebViewPage
{
private ViewDataDictionary<TModel> _viewData;
public new AjaxHelper<TModel> Ajax { get; set; }
public new HtmlHelper<TModel> Html { get; set; }
public new TModel Model { get { return ViewData.Model; } }
}
我们可以通过使用ViewBag
或ViewData
握住你的特殊性能实现您的结束。第一步是创建WebViewPage<TModel>
自定义导出你想要的属性:
public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
public IList<string> Messages
{
get { return ViewBag.Messages ?? (ViewBag.Messages = new List<string>()); }
}
}
现在去到您的视图,并替换为以下行@model YourModelClass
(第一行):
@inherits CustomWebViewPage<YourModelClass>
您现在可以在视图中使用Messages
属性。
@String.Join(", ", Messages)
要在控制器上使用它,你可能会想从Controller
派生并添加属性那里。
public abstract class CustomControllerBase : Controller
{
public IList<string> Messages
{
get
{
return ViewBag.Messages ?? (ViewBag.Messages = new List<string>());
}
}
}
现在,如果您从该控制器派生,则可以使用您的新属性。您在列表中添加的任何内容也将在视图中提供给您。
public class ExampleController : CustomControllerBase
{
public ActionResult Index()
{
Messages.Add("This is a message");
return View();
}
}
我使用ViewBag,因为它使属性获得更短。如果您愿意(ViewData["Messages"]
),您可以使用ViewData
做同样的事情。
这与Model
的实施方式并不完全相同,因为如果您碰巧使用了您要保存的密钥,某人可能意外覆盖了您的财产,但它足够接近以至于在功能上等同于您确保使用一个唯一的密钥。
如果您深入挖掘,您可能可以从ViewDataDictionary
派生出来,然后将您的属性放在那里,然后重写一些控制器和视图方法以代替它。那么你的财产将与Model
完全一样。但我会把它留给你 - 我认为这不值得。
你真的有2个选择:ViewBag和在你的模型中的专用属性 – 2013-03-22 20:58:21