MVC是否可以自定义或覆盖视图?

时间:2013-01-03 09:58:00

标签: asp.net-mvc asp.net-mvc-4

这是一个典型的场景,每个应用程序模型都继承了一个基类。此基类包含一些属性,这些属性在查询字符串形式的不同参数上表现不同。

我希望有一个集中的机制来处理场景,比如当控制器返回一个视图时我抓住模型并在属性中提供值。

有可能吗?

2 个答案:

答案 0 :(得分:1)

哇,非常开放式的问题。如果您只想计算/获取要在特定视图中显示的一些额外信息,可以使用控制器中的 ViewBag 对象。

ViewBag.Greeting = "Welcome, " + User.FirstName;

然后,在您的Razor代码中,您可以通过@ViewBag.Greeting(或ASPX中的<%=ViewBag.Greeting%>)访问此代码。 ViewBag继承自ASP.NET的 ViewData 对象,该对象(有效地)动态地键入并接受您抛出的任何对象结构。简而言之,非常强大,易于使用,但在运行时可能会导致其他方法在编译时遇到的问题

当然,您可能会遇到类(或数据源)中的数据格式不正确而无法使用View的问题。这在开发与现有生态系统接口的应用程序(即您将要编写的大部分代码)时非常常见。在这种情况下,查看模型是您的朋友:http://en.wikipedia.org/wiki/View_model

除项目中的 / Models 文件夹外,还要创建 / ViewModels 命名空间,并将这些命名空间与您的视图相匹配。因此,对于 /Views/Product/Details.cshtml ,您可以创建 /ViewModels/Product/Details.cs 类,并将id(或模型)传入一个论点。使用你在你的控制器中添加using MyProject.ViewModels吧!

答案 1 :(得分:0)

您可以创建自己的Custom ActionResult类。像这样:

public class CustomActionResult : ActionResult
{
     public override void ExecuteResult(ControllerContext context) 
     {
          // your logic here
     }
}

public ActionResult YourAction() 
{
     return new CustomActionResult (viewModel);
}