Я работаю над своим первым приложением ASP.NET MVC 3 и у меня есть два контроллера с представлениями, IceCreamController / IceCreamView и RecipeController / RecipeView, и на каждом пользователь может сделать выбор и отобразить рецепт.
Выбор вызывает отображение PartialView, который ссылается на него. При нажатии отображается EditView для этого рецепта, что позволяет пользователю редактировать атрибуты выбранного элемента рецепта.
Отлично. Это работает нормально, за исключением того, что в настоящее время действие POST в RecipeController выглядит так:
[HttpPost]
public ActionResult Edit(RecipeViewModel viewModel)
{
// updates the underlying model with the viewModel
// other things not germane to the discussion
return View();
}
и в итоге всегда отображается индексное представление для рецепта, а это не то, что мне нужно. Скорее, я хотел бы иметь возможность отправить пользователя обратно в соответствующий вид (IceCreamView или RecipeView), когда они отправили свои изменения.
Я предполагаю, что другие сделали что-то похожее на это. Как сообщить, на какой контроллер / действие следует перенаправить после завершения редактирования?
Примечание:
Я добавил немного выше, чтобы уточнить, что у меня есть два отдельных контроллера (IceCreamController и RecipeController), и у каждого есть представление, которое может выбрать и в конечном итоге сделать
@Html.Partial("_Recipe", model.recipe)
для отображения деталей определенного рецепта. Моя проблема заключается в том, как перенаправить страницу обратно в IceCreamView или RecipeView с помощью действия Edit на RecipeController - по сути, как мне сообщить, куда она должна идти, поскольку сведения о рецепте могли отображаться любым путем.
Используемое решение:
Как вы можете прочитать ниже в комментариях к ответу Даррина, поскольку у меня задействовано более одного контроллера, решение состоит в том, чтобы использовать view-модель для передачи контроллера / действия, которое должно быть перенаправлено на выполнение при редактировании. сообщение завершено.
Поскольку у меня есть более одного экземпляра этой ситуации (поступление на страницу редактирования по нескольким путям), я думаю, что создание простого BaseViewModel для хранения этой функциональности может быть в порядке, а затем все соответствующие модели представления наследуются от что 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; }
}
И тогда конструктор модели представления можно просто изменить, чтобы передать контроллер / действие и передать его базовому классу.
Могут быть и другие решения, и если да, я бы хотел их услышать.