Можно ли сделать сообщение из действия "Сохранить" в контроллере "Продукт" в действие "Сохранить" в контроллере "Категория"?
А также передавая параметр FormCollection как параметр
Можно ли сделать сообщение из действия "Сохранить" в контроллере "Продукт" в действие "Сохранить" в контроллере "Категория"?
А также передавая параметр FormCollection как параметр
Вы можете объявить форму, как это в своем представлении, и можете указать любой контроллер или действие, которое вы хотите.
Html.BeginForm("SaveAll", "Category", FormMethod.Post);
Если вы находитесь в контроллере, вы можете использовать.
TempData["Model"] = Model;
RedirectToAction("SaveAll", "Category");
Я бы либо просто обновил свои категории в вашем репозитории непосредственно из метода контроллера продукта, либо реорганизовал функцию "Сохранять категории" в своем собственном методе, и вызвал это из обоих методов контроллера.
public class Product : Controller
{
...
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(FormCollection productValues)
{
...
RedirectToAction("SaveAll", "Category", new { formValues = productValues });
}
...
}
public class Category : Controller
{
...
public ActionResult SaveAll(FormCollection formValues)
{
...
}
}
Предполагается, что вы выполняете POST в контексте Продукта.
Так как POST
- это глагол для HTTP-запроса, это имеет смысл (как написано), если метод .Save()
инициирует соединение loopback HTTP с соответствующим маршрутом .SaveAll()
, (например, http://..../Category/SaveAll
) и передает сбор формы в рамках запроса. Это глупо и не рекомендуется, так как это нарушит вашу способность к unit test этому контроллеру.
Если, однако, вы имеете в виду, что хотите вызвать .SaveAll()
и вернуть полученный результат клиенту, вы можете использовать .RenderAction()
и передать модель или коллекцию форм, полученные .Save()
в качестве параметра.
Или, на стороне сервера, просто создайте экземпляр контроллера категории и вызовите его метод .SaveAll(), снова передав модель, полученную .Save()
в качестве параметра.
public ActionResult Save(MyModel m)
{
Category cat = new Category();
return cat.SaveAll(m);
}
Однако вам придется принять результат этого вызова и убедиться, что он правильно обработал полученный результат.
Если это то, что вы пытаетесь сделать, стоит отметить, что вы действительно должны иметь код метода .SaveAll()
, который выполняет сохранение, разделенное на выделенный бизнес-логический уровень, вместо того, чтобы жить в контроллере. Вся эта функциональность должна теоретически быть доступной для использования в другом контроллере или в библиотеке, которая может быть включена в другие приложения.
return RedirectToAction ( "ViewService", "Admin" )
Здесь "ViewService" - это имя действия, а "Admin" - имя контроллера