【问题标题】:Single Controller with Multiple Views具有多个视图的单个控制器
【发布时间】:2009-03-05 18:48:31
【问题描述】:

我正在尝试创建具有多个视图但使用单个控制器的 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 始终使用模式版本,无论视图呈现什么。这是实现我的目标的正确方向吗?如果是这样,我缺少什么来让动作链接正常工作。下面是 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);
    }
}

【问题讨论】:

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


    【解决方案1】:

    您是否尝试在默认路由的默认数组中添加 mode=""?也就是说,据我了解,“索引”操作是如何从 URL 中省略的,所以理论上应该使它与我相信的默认路由匹配。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这可行,我可以通过创建一个基础 ApplicationController 来集中视图,但希望有 2 个独立的视图结构。
      【解决方案3】:

      Asp.Net 框架的伟大之处在于它具有很强的可扩展性。我认为您应该查看此链接。它将拥有您正在寻找的东西。我和作者的意见是创建一个 ActionFilter 并在需要 XML 甚至 JSON 视图的控制器中装饰您的视图。我什至见过所有对 XML 的序列化都发生在 Filter 中并被返回的情况,因此不需要 ViewEngine。

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

      【讨论】:

        猜你喜欢
        • 2014-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        相关资源
        最近更新 更多