在 ASP.NET MVC 中,您可以随意使用ViewBag
、、ViewData
和TempData
(有关更多信息,请参阅此博客文章)。这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 是因为它使属性 getter 更短。ViewData
如果您愿意,您可以使用 ( ) 做同样的事情ViewData["Messages"]
。
这与实现方式并不完全相同,Model
因为如果有人碰巧使用您正在保存的密钥,他们可能会意外覆盖您的属性,但如果您确保使用唯一的密钥,它就足够接近以在功能上等效。
如果您深入挖掘,您可能能够从中派生ViewDataDictionary
并将您的属性放在那里,然后覆盖一些控制器和视图方法来使用它。那么您的属性将与 完全相同Model
。但我会把它留给你——我认为这不值得。