ASP.Net MVC - сообщение от одного контроллера к другому (действие к действию)

Можно ли сделать сообщение из действия "Сохранить" в контроллере "Продукт" в действие "Сохранить" в контроллере "Категория"?

А также передавая параметр FormCollection как параметр

Ответ 1

Вы можете объявить форму, как это в своем представлении, и можете указать любой контроллер или действие, которое вы хотите.

Html.BeginForm("SaveAll", "Category", FormMethod.Post);

Если вы находитесь в контроллере, вы можете использовать.

TempData["Model"] = Model;
RedirectToAction("SaveAll", "Category");

Ответ 2

Я бы либо просто обновил свои категории в вашем репозитории непосредственно из метода контроллера продукта, либо реорганизовал функцию "Сохранять категории" в своем собственном методе, и вызвал это из обоих методов контроллера.

Ответ 3

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 в контексте Продукта.

Ответ 4

Так как 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(), который выполняет сохранение, разделенное на выделенный бизнес-логический уровень, вместо того, чтобы жить в контроллере. Вся эта функциональность должна теоретически быть доступной для использования в другом контроллере или в библиотеке, которая может быть включена в другие приложения.

Ответ 5

return RedirectToAction ( "ViewService", "Admin" )

Здесь "ViewService" - это имя действия, а "Admin" - имя контроллера