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