我有一个返回ActionResult的控制器。具体来说,它在方法结束时调用return View(someViewModel)
。这是方法签名:
protected ActionResult SomeControllerMethod(AViewModel someViewModel)
我后来继承自AViewModel
(AnInheritedViewModel
),为该类添加了一些新属性,现在将其传递给SomeControllerMethod
。
现在,在此方法结束时的return语句中,我收到有关如何找不到视图的错误。这很公平,但我不确定这一切都是默认的。
视图名称MVC告诉我它正在寻找不与控制器方法或模型类型的名称对齐。按照相同的模式,没有与原始模型的名称相对应的视图。所以我不确定MVC如何决定它将使用哪个视图?
答案 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