在“编辑”操作中指定要加载的视图

时间:2011-07-22 17:26:36

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我正在开发我的第一个ASP.NET MVC 3应用程序,我有两个带有视图的控制器,IceCreamController / IceCreamView和RecipeController / RecipeView,每个用户都可以进行选择并显示配方。

选择会导致显示PartialView,其中包含Edit链接。单击时,将显示此配方的EditView,允许用户编辑所选配方项的属性。

大。这工作正常,但目前RecipeController中的POST操作如下所示:

[HttpPost]
public ActionResult Edit(RecipeViewModel viewModel)
{
   // updates the underlying model with the viewModel
   // other things not germane to the discussion

   return View();
}

并且最终总是显示Recipe的Index视图,这不是我想要的。相反,我希望能够做的是在用户提交更改后将用户发送回相应的View(IceCreamView或RecipeView)。

我认为其他人已经做了类似的事情。如何在编辑完成时告知应将哪些控制器/操作重定向到?


注意: 我在上面添加了一点,以澄清我有两个独立的控制器(IceCreamController和RecipeController),每个控制器都有一个可以选择并最终执行的视图

@Html.Partial("_Recipe", model.recipe)

显示特定食谱的详细信息。我的问题是如何通过RecipeController上的编辑操作将页面重定向回IceCreamView或RecipeView - 本质上,如何通过任一路径显示配方详细信息,我该如何进行通信。


使用解决方案:

正如您在Darrin的回答评论中所述,由于我涉及的控制器不止一个,因此解决方案是利用viewmodel传入控制器/操作,应该在编辑时将其重定向到以下内容邮政行动完成。

由于我有多个这种情况的实例(通过多个路径到达Edit页面),我认为创建一个简单的BaseViewModel来保存这个功能可能是有序的,然后让所有适用的viewmodel继承自那个BaseViewModel。

我认为它不应该像以下那样:

public BaseViewModel
{
   public BaseViewModel(string controller, string action)
   {
      ControllerName = controller ?? string.empty;
      ActionName = action ?? string.empty;
   }

   public string ControllerName { get; set; }
   public string Action { get; set; }
}

然后可以修改viewmodel的构造函数以传递控制器/动作并将其交给基类。

可能还有其他解决方案,如果有,我希望听到它们。

1 个答案:

答案 0 :(得分:4)

[HttpPost]
public ActionResult Edit(RecipeViewModel viewModel)
{
    // updates the underlying model with the viewModel
    // other things not germane to the discussion

    return View("IceCreamView");
}

或者如果你想重定向,你可以有一个控制器动作来提供这个视图,然后return RedirectToAction("IceCream");这可能更正确,而不是直接从POST动作返回一个视图,以防万一。