基本上我有一堆以通用方式收集数据的提交表单 - >将输入/值对序列化为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 ...所以如果有更好的方法,请告诉我。
答案 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"]); %>
这样,您就没有一堆硬编码路径可以处理。但是,您必须处理传递给路径的错误和不正确的方法。