1

在我的控制器的一个动作中,我必须执行同一个控制器的另一个动作。这两个操作都在相同的安全上下文中。我是否必须调用 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));
}

在共享方法的情况下,我的 http 请求比在 RedirectAction 的情况下少,但在 RedirectAction 中,我有一个使用 Asp.Net MVC 方式更自然的流程。

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

注意:我故意不使用帖子查询,因为我知道在这种情况下,PRG 模式对于防止客户端出现不需要的行为至关重要,因为在使用浏览器的后退按钮时,可能会向服务器发送多个帖子。

非常感谢。

4

3 回答 3

1

这是个好问题。

即使我不能 100% 确定完全正确的答案,我也会在我的应用程序中使用“共享方法”方法。原因是——简单。

同时,您正确地注意到这RedirectToAction是更多的 ASP.NET MVC 方式。

对于您发布的这种情况,我会完全避免这种行为。如果用户请求项目的“列表”,您应该向他显示一个列表,即使集合中只有一个项目。如果他决定查看详细信息,他会点击它。因此,您拥有简单的控制器操作和干净的视图。

于 2012-07-24T06:25:04.867 回答
1

正如您所说,我认为您应该创建一个共享方法。如果您这样做RedirectToAction,则会向您的 Webbserver 发出新请求。

于 2012-07-24T06:27:04.540 回答
0

嗯,也许你应该只返回另一个视图。费:

[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);
    }
}
于 2012-07-24T11:47:51.417 回答