具有多个视图的单控制器

时间:2009-03-05 18:48:32

标签: asp.net-mvc model-view-controller

我正在尝试使用单个控制器创建具有多个视图的MVC应用程序。我开始创建第二个路由,其中​​包含另一个可用于重定向到第二个文件夹的属性。

        public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "xml",                                              // Route name
            "xml/{controller}/{action}/{id}",                           // URL with parameters
            new { mode = "xml", controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }
    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
        SessionManager.Instance.InitSessionFactory("acstech.helpWanted");
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new ModeViewEngine()); 
    }

我通过WebFormViewEngine降序并将路径从〜/ View更改为〜/ {mode} View。这工作和运行正确地渲染页面。我遇到的问题是Html.ActionLink总是使用模式版本,无论视图呈现什么。这是实现我的目标的正确方向,如果是这样,我错过了什么让Action Link正常工作。下面是ViewEngine。这是一个实验室测试,因此已经采取了一些自由。

public class ModeViewEngine : WebFormViewEngine
{
    public ModeViewEngine()
    {

    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        string mode = String.Empty;
        if (controllerContext.RouteData.Values["mode"] != null)
            mode = controllerContext.RouteData.Values["mode"] as string;
        return new WebFormView(partialPath.Replace("~/Views", "~/" + mode + "Views"), null);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        string mode = String.Empty;
        if (controllerContext.RouteData.Values["mode"] != null)
            mode = controllerContext.RouteData.Values["mode"] as string;
        return new WebFormView(viewPath.Replace("~/Views", "~/" + mode + "Views"), masterPath);
    }
}

3 个答案:

答案 0 :(得分:1)

您是否尝试在默认路由的默认数组中添加mode =“”?也就是说,正如我所理解的那样,如何从URL中省略“索引”操作,因此理论上它应该与我认为的默认路由匹配。

答案 1 :(得分:0)

为什么不让控制器根据模式选择不同的视图?然后您可以返回Home视图或Home_Xml。

我猜你的方法是将这个决定从控制器中移出并集中逻辑,但它还要求你在每个模式中创建一个匹配的视图。

答案 2 :(得分:0)

Asp.Net框架的优点在于它是非常可扩展的。我想你应该查看这个链接。它将完全符合您的要求。我的观点与作者一起创建一个ActionFilter并在需要XML甚至JSON视图的控制器中装饰你的视图。我甚至看到过这样的情况:所有序列化到XML都发生在Filter中并且返回,因此不需要ViewEngine。

http://jesschadwick.blogspot.com/2008/06/aspnet-mvc-using-custom-view-engines.html