为什么需要cshtml扩展?

时间:2016-06-08 10:48:59

标签: asp.net-core asp.net-core-mvc asp.net-core-1.0

我已经使用MVC 2年了,在这段时间里,我从来不必在引用视图时使用`.cshtml'扩展名。现在我升级到RC2并开始收到“查看未找到错误”。除了添加扩展的痛苦之外,我现在有很多不包含扩展名的代码。

有没有办法取消对此扩展的需求?

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

2 个答案:

答案 0 :(得分:1)

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

return View("hello-world");

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

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

答案 1 :(得分:0)

作为Ron C wrote above,它不是关于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;
    }
}