.NET MVC 4 - 在同一个Controller上有多个“动作”,怎么做?

时间:2012-11-23 10:05:12

标签: c# .net asp.net-mvc

在我开始捏造自己的方法之前,我正在把头发拉过这个,我正在寻找指导。

这就是我所拥有的:

查看摘要

<td>@Html.ActionLink("More Details", "Index", new { id = product.ProductId })</td>
<td>@Html.ActionLink("Compare", "Compare", new { id = product.ProductId, compare = true })</td>

控制器代码段

public ActionResult Index(FormCollection values)
{
    // Does stuff, works
}

public ActionResult Index(int productId)
{
    // Does stuff, works
}

现在,这就是我的问题所在。现在,从POST到表单,以及单击“更多详细信息”ActionLink,都会使用索引函数。这很好。

现在我希望“比较”功能正常,我希望在同一页面上保存一份比较产品列表,这很好。但是如何在同一个视图/页面上获得比较功能?!

我试过了:

public ActionResult Compare(int productId)
{

}

但显然这不起作用,因为它需要一个Compare.cshtml,我不想发生。我希望它能够修改我的ViewModel并使用新的Compare产品返回它,所以我可以从我原来的View中做到这一点:

@foreach(var products in Model.ComparedProducts)

我能看到我这样做的唯一方法就是“捏造它”:

public ActionResult Index(int productId = 0, bool compare)
{

}

在同一页面上有很多功能可能会变得难以驾驭。

肯定有一些明显我在这里缺席的东西?

哦,AjaxLink选项不适合我,因为这是必须通过回发(Progress Enhancement和所有爵士乐)工作的网站的一部分。

2 个答案:

答案 0 :(得分:9)

我认为你通过调用return View(model)返回一个ActionResult,是吗?如果没有明确命名视图 ,MVC解析机制将查找与操作同名的视图,在您的情况下为“Compare.cshtml”。

如果您将呼叫更改为return View("Index", model),则无论操作名称如何,您都将使用Index.cshtml视图。

那是你在找什么?

答案 1 :(得分:5)

MVC中的操作不需要相应的视图。它可以通过向View()函数提供名称参数来返回任何视图 - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.view%28v=vs.98%29.aspx

您可以在比较功能中执行所需的所有逻辑,并使用RedirectToAction()重定向回索引操作或根据需要显示页面的任何其他操作。