1

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

protected ActionResult SomeControllerMethod(AViewModel someViewModel)

我随后从AViewModel( AnInheritedViewModel) 继承,向该类添加了一些新属性,现在将其传递给SomeControllerMethod.

现在,在此方法末尾的 return 语句中,我收到一个关于如何找不到视图的错误。这很公平,但我不确定这一切默认情况下是如何工作的。

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

4

3 回答 3

5

当你

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

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

您可以通过以下方式覆盖它:

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

并且 MVC 将因此尝试找到“MyView.cshtml”。

于 2012-12-14T17:16:45.217 回答
3

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

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

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

于 2012-12-14T17:36:28.487 回答
1

当用户在浏览器中输入 URL 时,MVC 应用程序使用 Global.asax 文件中定义的路由规则来解析 URL 并确定控制器的路径。然后控制器确定适当的操作方法来处理请求。默认情况下,请求的 URL 被视为包含控制器名称后跟操作名称的子路径。例如,如果用户输入 URL http://contoso.com/MyWebSite/Products/Categories,子路径是/P​​roducts/Categories。默认路由规则将“Products”作为控制器的前缀名,必须以“Controller”结尾(如ProductsController)。它将“类别”视为操作的名称。因此,路由规则调​​用 Products 控制器的 Categories 方法来处理请求。如果 URL 以 /Products/Detail/5 结尾,则默认路由规则将“Detail”作为操作的名称,并调用 Products 控制器的 Detail 方法来处理请求。默认情况下,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

于 2012-12-14T17:37:06.240 回答