为什么需要 cshtml 扩展?

Why is cshtml extension required?

我使用 MVC 已经 2 年了,在这段时间里,我在引用视图时从未使用过“.cshtml”扩展名。现在我升级到 RC2 并开始获得 "View not found errors"。除了添加扩展的痛苦之外,我现在有很多不包含扩展的代码。

有没有办法消除对这个扩展的需求?

PS:我不知道迁移到 RC2 时发生了什么,但我没有升级我的项目而是创建了一个新项目并从旧项目复制了所有 类、控制器和视图然后修复命名空间。

我注意到的一件事是,如果仅返回视图名称,则不需要 .cshtml,例如:

return View("hello-world");

但是如果还指定了视图的位置,则需要,例如:

return View("/Views/Universe/hello-world.cshtml");

作为 Ron C ,这与 ViewResultPartialViewResult 无关,而是缺少文件扩展名“.cshtml”,当您 "viewName" 参数有一个相对路径值。

这就是 RazorViewEngineIRazorViewEngine 的默认实现)在 RC2 中的工作方式。可以查看代码here.

一种解决方案是重写 BaseController 的 View 和 PartialView 方法,以便在需要时自动附加“.cshtml”。

public class BaseController : Controller
{
    [NonAction]
    public override ViewResult View(string viewName, object model)
    {
        return base.View(AppendRazorFileExtensionIfNeeded(viewName), model);
    }

    [NonAction]
    public override PartialViewResult PartialView(string viewName, object model)
    {
        return base.PartialView(AppendRazorFileExtensionIfNeeded(viewName), model);
    }

    private string AppendRazorFileExtensionIfNeeded(string viewName)
    {
        // If viewname is not empty or null
        if (!string.IsNullOrEmpty(viewName))
        {
            // If viewname does have a relative path
            if (viewName[0] == '~' || viewName[0] == '/')
            {
                // If viewname does not have a ".cshtml" extension
                if (!viewName.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase))
                {
                    viewName = string.Concat(viewName, ".cshtml");
                }
            }
        }

        return viewName;
    }
}