我正在尝试使用单个控制器创建具有多个视图的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);
}
}
答案 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