将所有控制器操作路由到单个方法,然后根据操作名称显示视图

时间:2009-08-12 00:11:41

标签: asp.net-mvc

基本上我有一堆以通用方式收集数据的提交表单 - >将输入/值对序列化为CSV文件。我想添加新的提交页面而不必编写新的控制器操作(我不需要编译和部署新的程序集)。所以,这是我的想法:

http://foobar.com/Submission/Contact
http://foobar.com/Submission/Apply

两者都应该路由到SubmissionController.Handle()方法。 Handle方法将显示适当操作的视图:

return View("Contact");
// or
return View("Apply");

视图的形式操作都是“/ Submission / Handle”,控制器会有:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Handle(FormCollection inputs)

所以a)我如何路由联系和应用到句柄的动作和b)如何在SubmissionController中查询动作名称,以便我可以这样做:

var viewName = GetActionName();
return View(viewName);

显然我是ASP.NET MVC的n00b ...所以如果有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

您必须编写自定义路线。 例如,在默认路由之前的global.asax中:

// Submission/*
routes.MapRoute(
      "Submission",
      "Submission/{method}", 
      new { controller = "Submission", action = "Handle", method = "" }
      );

您可以在括号内添加任何内容,这将是RouteValueDictionary中路由值的关键。请注意,控制器和操作是ASP.NET MVC中使用的约定。

你说的方式如下: 要在控制器中访问这个名为“method”的新密钥,您需要执行以下操作:

string methodName = RouteData.Values["method"];

然后,我想为你的每个方法做一个开关。

也许更简单的方法: 我没有做一个特定视图的回复,而是做了:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Handle(FormCollection inputs)
    {
        ViewData["method"] = RouteData.Values["method"];

        return View();
    }

将methodName添加到ViewData。并返回HandleView。然后,为每种表单类型创建一个部分。在HandleView中,输入:

<% Html.RenderPartial(ViewData["method"]); %>

这样,您就没有一堆硬编码路径可以处理。但是,您必须处理传递给路径的错误和不正确的方法。

相关问题