我已经使用MVC 2年了,在这段时间里,我从来不必在引用视图时使用`.cshtml'扩展名。现在我升级到RC2并开始收到“查看未找到错误”。除了添加扩展的痛苦之外,我现在有很多不包含扩展名的代码。
有没有办法取消对此扩展的需求?
PS:我不知道移动到RC2时发生了什么,但我没有升级我的项目而是创建了一个新的项目,并复制了旧项目中的所有类,控制器和视图,然后修复了名称空间。答案 0 :(得分:1)
我注意到的一件事是,如果仅返回视图名称,则不需要.cshtml,例如:
return View("hello-world");
但是如果还指定了视图的位置,则需要它,例如:
return View("/Views/Universe/hello-world.cshtml");
答案 1 :(得分:0)
作为Ron C wrote above,它不是关于ViewResult
或PartialViewResult
,它关于缺少文件扩展名“.cshtml”,当“viewName”参数具有相对路径值时。
这就是RazorViewEngine
(IRazorViewEngine
的默认实现)在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;
}
}