RedirectToAction上的强类型视图模型

时间:2010-12-02 00:15:28

标签: asp.net-mvc redirecttoaction

我有两个看起来像这样的动作方法

    [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);
    }

是否有标准的最佳实践方法来做这样的事情?

3 个答案:

答案 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()或其他东西。在不需要重定向时不使用重定向是最佳做法。

如果这回答了你的问题,或者我能为你做更多的事情,请告诉我,谢谢。