Asp.net MVC同名视图,路径不同

时间:2009-07-23 04:32:19

标签: asp.net asp.net-mvc

我想拥有多个包含相同名称视图的路径文件夹结构:

/profile.aspx
/admin/profile.aspx
/user/editpost.aspx
/admin/editpost.aspx

/Controllers
  |- PostController.cs
  |- ProfileController.cs

我希望能够将所有常规页面放在文件夹中,将管理页面放在另一个文件夹中。我是否需要组织我的Views文件夹,如:

/Views
  /User
    /Story
      |- editpost.aspx
    /Profile
      |- profile.aspx
  /Admin
    /Story
      |_ editpost.aspx
    /Web
      |- profile.aspx

或者我有办法做到这一点:

/User
  /Views
    /Story
      |- editpost.aspx
    /Profile
      |- profile.aspx
/Admin
  /Views
    /Story
      |_ editpost.aspx
    /Web
      |- profile.aspx

另外,如何为/ User和/ Admin编写/组织/使用可能具有相同名称的单独控制器?

如果我不清楚,请告诉我。

谢谢!

6 个答案:

答案 0 :(得分:10)

没问题。您可以以您选择的任何方式组织文件夹。您可以按名称或甚至在Action方法中的路径指定视图:

return View("~/Views/Posts/Index.aspx");

答案 1 :(得分:5)

您应该按this post阅读Phil Haack

基本上,您必须创建自己的ViewEngine才能使用文件夹设计。

答案 2 :(得分:4)

第一个版本的主要问题之一(当然还有所有RC和Beta)是ASP.NET MVC不支持的区域。区域是ASP.NET的替代MVC框架已经支持了一段时间,当您的项目达到合理的大小时,您最终可能会在同一文件夹和代码中使用数百个控制器(所有控制器都具有唯一名称)很难排序。

您的想法非常有意义,我希望ASP.NET MVC框架的未来实例支持开箱即用的区​​域(可以这么说)。与此同时,很容易在ASP.NET MVC之上创建自己的区域框架。

以下是一些可以帮助您的帖子:

希望他们对你有所帮助。

答案 3 :(得分:1)

还有另一种选择:
您可能想要创建自定义ViewEngine并指定视图/部分视图位置。

例如:

 //Global.asax
 public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            ...                
            ViewEngines.Engines.Add(new ViewEngine());
            ...
        }
    }

public class ViewEngine : WebFormViewEngine
    {
        public ViewEngine()
        {
            PartialViewLocationFormats = PartialViewLocationFormats
                .Union(new[] {"~/Views/{1}/Partial/{0}.ascx"});
        }
    }

允许您将“Partial”文件夹用于部分视图。

但我个人更喜欢区域。似乎这正是你所需要的。

答案 4 :(得分:0)

每个编辑视图很可能需要不同的字段,因此共享editpost并不可行。

如果您正在编辑[完全]相同的字段,那么可能会按照您的方式组织视图,然后渲染可以将模型传递给的部分视图。

partialView可以在一个共同的位置,在视图方面保持关注点的分离以及部分视图的代码重用。

每个控制器都有自己的名称,如UserController和AdminController。在其中的每一个中你都有你的editpost动作没有probs。

这有帮助还是需要更多?

答案 5 :(得分:0)

您是否尝试在控制器中传递特定视图?我认为您可以通过在任何控制器上传递特定视图来绕过MVC公共视图文件夹设计(但我不会推荐它)。

我不是100%肯定,但我认为你可以做像

这样的事情

return View("User/Story");  //or something in that matter

但是,您需要更改路线,以便控制器相应地进行路由。我想我前一段时间读过它,但我找不到参考文献。如果有效,请告诉我。

但是,如果您的视图正在指示您的设计,那么也许您不应该使用MVC。