Asp.Net MVC RedirectAction或Shared方法

时间:2012-07-24 00:36:02

标签: c# asp.net-mvc post-redirect-get

在我的控制器的动作中,我必须执行同一控制器的另一个动作。这两个操作都在相同的安全上下文中。我是否必须调用RedirectAction来执行其他操作,还是我必须创建一个可以调用这两个操作的共享方法?

作为使用RedirectAction的示例:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(string value)
{
   IPresenter presenter = new Presenter();
   List<Item> items = presenter.GetList(value);

   if (items.Count > 1)
      return base.View("List", items);
   else
      return base.RedirectAction("Detail", new { id = items.First().Id });
}

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Detail(int id)
{
   IPresenter presenter = new Presenter();

   return base.View(presenter.GetItemById(id));
}

使用共享方法的示例:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(string value)
{
   IPresenter presenter = new Presenter();
   List<Item> items = presenter.GetList(value);

   if (items.Count > 1)
      return base.View("List", items);
   else
      return this.GetDetail(id);
}

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Detail(int id)
{
   return this.GetDetail(id);
}

private ActionResult GetDetail(int id)
{
    IPresenter presenter = new Presenter();

    return base.View(presenter.GetItemById(id));
}

在Shared方法案例中,我有一个http请求少于RedirectAction案例,但是使用RedirectAction,我有一个使用Asp.Net MVC方式更自然的流程。

您认为哪种情况最好?为什么?如果两者都取决于具体情况,那么好的和坏的情况是什么?

注: 我故意不使用帖子查询,因为我知道在这种情况下,PRG Pattern对于防止客户端出现不必要的行为至关重要,因为在使用浏览器的后退按钮时可以将多个帖子发送到服务器。 / em>的

非常感谢。

3 个答案:

答案 0 :(得分:1)

这是个好问题。

即使我不确定100%是否正确答案,我在我的应用程序中使用“共享方法”方法。原因是 - 简单。

同时,您正确地注意到RedirectToAction更像ASP.NET MVC方式。

对于你发布的情况,我会完全避免这种行为。如果用户请求了“列表”项目,您应该向他显示一个列表,即使集合中只有一个项目。如果他拒绝检查细节,他会点击它。因此,您可以使用简单的控制器操作和清晰的视图。

答案 1 :(得分:1)

我认为你应该像你说的那样创建一个共享方法。如果您执行RedirectToAction,则会向您的Webbserver发出新请求。

答案 2 :(得分:0)

嗯,也许你应该返回另一个观点。 f.e:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(string value)
{
    IPresenter presenter = new Presenter();
    List<Item> items = presenter.GetList(value);

    if (items.Count > 1)
    {
        return base.View("List", items);
    }  
    else
    {
        //your logic and model from Detail Action f.e:
        var model = repository.GetDetailModel(items.First().Id);

        return View("Detail", model);
    }
}