代码之家  ›  专栏  ›  技术社区  ›  xanadont

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

  •  0
  • xanadont  · 技术社区  · 15 年前

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

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

    两者都应该路由到submissionController.handle()方法。handle方法将显示相应操作的视图:

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

    这些视图都将其表单的操作设置为“/提交/处理”,并且控制器将具有:

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

    因此a)如何路由操作联系人并应用于句柄;b)如何在SubmissionController中查询操作名称以便执行以下操作:

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

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   Joseph Yaduvanshi    15 年前

    你必须写一个自定义的路线。 例如,在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中,输入:

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

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