Catch-all控制器,MVC

时间:2014-07-08 12:06:13

标签: c# asp.net-mvc asp.net-mvc-5.1

我目前正在开发一个MVC 5项目,该项目将有几个控制器,其中一个(InformationController)只对所有操作执行相同的操作,即:

public ActionResult ActionName()
{
    LayoutModel Model = new LayoutModel();
    return View(Model);
}

是否可以在一个泛型操作中捕获所有操作?这样就可以在不重新编译的情况下添加新视图。再说一遍,传递的模型总是LayoutModel,并且永远不会有任何参数。

2 个答案:

答案 0 :(得分:6)

这对你有用。创建一个新路由,以便该控制器不需要该操作,而是传递视图名称:

routes.MapRoute(
    name: "InformationControllerSharedAction",
    url: "Information/{actionType}",
    defaults: new { controller = "Information", action = "Index" }
);

然后使用您的索引操作,您现在基本上传递了要渲染的视图:

public ActionResult Index(string actionType)
{
    LayoutModel Model = new LayoutModel();
    return View(actionType, model);
}

这将允许以下网址:

www.website.com/Information/View1
www.website.com/Information/View2
etc.

您需要做的就是将视图(View1.cshtmlView2.cshtml等)放到正确的文件夹中。

答案 1 :(得分:0)

Global.asax 中注册路由(在App_Start / RouteConfig.cs中添加路由),以便重定向到genric操作的所有操作

routes.MapRoute(
    name: "Test",
    url: "{Home}/{test}/{id}",
    defaults: new { controller = "Home", action = "Genric", id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Test1",
    url: "{Home}/{test1}/{id}",
    defaults: new { controller = "Home", action = "Genric", id = UrlParameter.Optional }
);
routes.MapRoute(
    name: "Test2",
    url: "{Home}/{test2}/{id}",
    defaults: new { controller = "Home", action = "Genric", id = UrlParameter.Optional }
);