我刚刚遇到一个问题,我有一个视图(FindUser.aspx)尝试渲染局部视图(FindUser.ascx)。视图的默认搜索路径查找以各种文件夹中的视图命名的文件。相当令人惊讶的是,对于视图,它会查找扩展名为.aspx或.ascx的文件。部分视图使用相同的列表。
因为我的两个文件名相同,所以视图分辨率首先重复查找页面,然后进入无限循环。
我知道我可以通过调用视图和部分视图不同的名称来解决这个问题,或者只将视频位置更改为.aspx仅用于视图,而.ascx仅用于部分视图。
我的问题是为什么MVC默认查看这两个扩展?似乎更有意义的是视图==页面== .aspx和部分视图==控制== .ascx。那么为什么要浑水?
答案 0 :(得分:3)
因为部分与否,视图仍然是视图。使用FindUser.aspx和FindUser.ascx与使用两个具有相同名称的常规视图相同。
答案 1 :(得分:2)
我认为避免问题的方法是使用不同的视图名称。您可能不应该有两个视图,其文件名仅在扩展名中不同。但是,如果您真的想要一个严格的Page = View,Control = Partial映射,只需通过继承WebFormViewEngine创建自己的ViewEngine并更改视图位置格式:
public class MyWebFormViewEngine : WebFormViewEngine {
public MyWebFormViewEngine() {
base.ViewLocationFormats
= new string[] {"~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" };
base.PartialViewLocationFormats
= new string[] { "~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx" };
}
}
然后在Application_Start()中将其配置为View Engine:
// Call this method during Application_Start to setup your view engine
internal static void SetupViewEngines() {
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MyWebFormViewEngine());
}
答案 2 :(得分:1)
为了我的价值,我将“Control”附加到我所有的.ascx ViewUserControls的名称上。所以我会FindUser.aspx
和FindUserControl.ascx
。没有解决问题,但它可以避免命名冲突,从而避免它。
答案 3 :(得分:1)
渲染视图时,可以为MVC提供直接路径。假设我的Foo.aspx
文件夹中有Home
,Foo.ascx
中有Shared
部分视图。在您的操作方法中,您可以执行以下任一操作:
return View("~/Views/Shared/Foo.ascx"); // or
return View("~/Views/Home/Foo.aspx");
它会得到你正在寻找的合适的。
答案 4 :(得分:0)
<强>原因强>
在ASP.NET MVC中查看== UserControl。
<强>修正强>
使用不同的名称。
提示强>
将usercontrols命名为下划线前缀是常见的惯例。
答案 5 :(得分:0)
如果您正在使用区域,则必须在构造函数中添加其他位置格式:
public class ExtensionBasedWebFormViewEngine : WebFormViewEngine
{
public ExtensionBasedWebFormViewEngine()
{
ViewLocationFormats = new[] {"~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx"};
AreaViewLocationFormats = new[] {"~/Areas/{2}/Views/{1}/{0}.aspx", "~/Areas/{2}/Views/Shared/{0}.aspx"};
PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"};
AreaPartialViewLocationFormats = new[] { "~/Areas/{2}/Views/{1}/{0}.ascx", "~/Areas/{2}/Views/Shared/{0}.ascx" };
}
}