我有两个看起来像这样的动作方法
[HttpPost]
public ActionResult Search(Models.InputModel input)
{
if (!IsSearchCriteriaValid(input))
return RedirectToAction("Index");
TempData[TempDataSearchInput] = input;
return RedirectToAction("List");
}
public ActionResult List()
{
var input = TempData[TempDataSearchInput] as Models.InputModel;
if (!IsSearchCriteriaValid(input))
return RedirectToAction("Index");
var result = new List<MyDTO>();
AutoMapper.Mapper.Map( _repository.GetBy(input), results);
var model = new Models.DisplayListModel { Result = result };
return View("List", model);
}
是否有标准的最佳实践方法来做这样的事情?
答案 0 :(得分:1)
Erx_VB.NExT.Coder是正确的。搜索操作中的代码不是必需的。我假设你这样做了,因为你的表格是发布到/ [控制器] /搜索?如果您愿意,您仍然可以使用search.aspx视图,只需将表单指向/ [controller] / List,如下所示。
<% using (Html.BeginForm("foo", "bar", FormMethod.Post, new { id = "myID" }))
{ %>
<%} %>
will result in the following HTML:
<form action="/bar/foo" id="myID" method="post"></form>
答案 1 :(得分:1)
我同意你应该把它们组合成一个ActionResult。另一种方法是创建自定义路由。因此,在您的Global.asax文件中,将以下内容添加到RegisterRoutes函数中:
routes.MapRoute( "MySearch", "MyController/Search",
new { controller = "MyController", action = "List" }
);
这将自动将任何调用映射到Search to List,并且不再需要在代码中定义两个ActionMethod
答案 2 :(得分:0)
是的,您应该将搜索操作删除为仅复制代码(与List相同的代码),然后重定向到列表!所以,代码是多余的。如果需要,您可以重命名您的combine操作,以便在您组合它们时可能对代码更有意义,可能是SearchToList()或其他东西。在不需要重定向时不使用重定向是最佳做法。
如果这回答了你的问题,或者我能为你做更多的事情,请告诉我,谢谢。