我刚刚遇到了一个问题,我有一个试图呈现局部视图(FindUser.ascx)的视图(FindUser.aspx)。视图的默认搜索路径在各种文件夹中查找以视图命名的文件。令人惊讶的是,对于视图,它会查找扩展名为.aspx或.ascx的文件。而分部视图使用相同的列表。
因为我将这两个文件命名为相同的名称,所以视图分辨率反复地首先找到页面,然后陷入无限循环。
我知道我可以通过将视图和部分视图命名为不同的名称,或者将我的搜索位置更改为仅用于视图的.aspx和仅用于部分视图的.ascx来解决此问题。
我的问题是,为什么MVC默认两个扩展都要看?似乎更有意义是,一个视图是一个页面控件,一个局部视图是一个.aspx == == .ascx。那么,为什么要混水摸鱼呢?
发布于 2009-04-28 14:36:39
因为不管是否是部分的,视图仍然是视图。拥有FindUser.aspx和FindUser.ascx等同于拥有两个同名的常规视图。
发布于 2009-04-28 15:53:55
我认为避免这种问题的方法是使用不同的视图名称。您可能不应该有两个文件名仅在扩展名上不同的视图。然而,如果你真的想要一个严格的页面=视图,控件=部分映射,只需通过继承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()中将其配置为视图引擎:
// Call this method during Application_Start to setup your view engine
internal static void SetupViewEngines() {
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new MyWebFormViewEngine());
}发布于 2009-04-28 14:38:44
无论如何,我将“控制”附加到我所有.ascx ViewUserControls的名称中。所以我会有FindUser.aspx和FindUserControl.ascx。不能解决这个问题,但是它可以通过避免命名冲突来帮助你避免这个问题。
https://stackoverflow.com/questions/798278
复制相似问题