ASP.Net MVC如何确定从控制器使用的视图?

时间:2012-12-14 17:14:04

标签: asp.net-mvc-3 actionresult

我有一个返回ActionResult的控制器。具体来说,它在方法结束时调用return View(someViewModel)。这是方法签名:

protected ActionResult SomeControllerMethod(AViewModel someViewModel)

我后来继承自AViewModelAnInheritedViewModel),为该类添加了一些新属性,现在将其传递给SomeControllerMethod

现在,在此方法结束时的return语句中,我收到有关如何找不到视图的错误。这很公平,但我不确定这一切都是默认的。

视图名称MVC告诉我它正在寻找不与控制器方法或模型类型的名称对齐。按照相同的模式,没有与原始模型的名称相对应的视图。所以我不确定MVC如何决定它将使用哪个视图?

3 个答案:

答案 0 :(得分:5)

当你

public ActionResult SomeControllerMethod()
{
    return View();
}

MVC尝试查找名为“SomeControllerMethod.cshtml”的视图。它使用方法的名称作为查找视图文件的指南。

您可以通过以下方式覆盖此内容:

public ActionResult SomeControllerMethod()
{
    return View("MyView");
}

然后MVC会尝试找到“MyView.cshtml”。

答案 1 :(得分:3)

另外请务必注意/Views/Shared中的视图(默认情况下,MVC也会搜索此文件夹)。但最令人讨厌的是当使用ActionNameAttribute重命名动作方法时,例如:

[ActionName("Bob")]
public ActionResult MyMethod()
{
    return View();
}

在这种情况下,MVC将寻找一个名为“Bob”的视图。

答案 2 :(得分:1)

  

当用户在浏览器中输入URL时,MVC应用程序会使用   在Global.asax文件中定义的路由规则来解析   URL并确定控制器的路径。控制器然后   确定处理请求的适当操作方法。通过   默认情况下,请求的URL被视为包含的子路径   控制器名称后跟操作名称。例如,如果是   用户输入网址http://contoso.com/MyWebSite/Products/Categories,   子路径是/ Products / Categories。默认路由规则处理   “Products”作为控制器的前缀名称,必须以   “Controller”(如ProductsController)。它将“类别”视为   行动的名称。因此,路由规则调​​用   Products控件的类别方法以便处理   请求。如果URL以/ Products / Detail / 5结尾,则为默认路由   规则将“详细信息”视为操作的名称和详细信息方法   调用Products控制器来处理请求。通过   默认情况下,URL中的值“5”将传递给Detail方法   作为参数。以下示例显示了一个控制器类   有一个HelloWorld动作方法。

public class MyController : Controller
{
    public ActionResult HelloWorld()
    {
        ViewData["Message"] = "Hello World!";
        return View();
    }
}

参考:http://msdn.microsoft.com/en-us/library/dd410269(v=vs.98).aspx