2010-04-30 3 views

ответ

8

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

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

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

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

Я думаю, что ОП пытается сделать это обновление его категории из представления продукта, и он хочет сохранить все СУХОЙ. –

+1

Не это ... Мне нужно, если я уже в действии и сделаю сообщение другому действию в другом контроллере ... – AndreMiranda

+1

@AndreMiranda, хорошо, но не является конечной целью сохранить ваши категории? Вас не волнует, как это происходит до тех пор, пока это происходит, используя лучшие практики? Что вы пытаетесь достичь? Если вам просто нужно вызвать другой метод контроллера, это можно сделать достаточно легко, не создавая запрос POST для этого. –

2

Так как POST глагол для запроса HTTP, это имеет смысл только (как написано), если метод .Save() инициирует соединение HTTP-кольцевой проверки к соответствующему .SaveAll(), (как http://..../Category/SaveAll) по маршруту и ​​проходит сбор формы, как часть запроса. Это глупо и не рекомендуется, , так как это нарушит вашу способность тестировать этот контроллер.

Если, однако, вы имеете в виду, что вы хотите назвать .SaveAll() и вернуть вынесенное результат обратно клиенту, вы могли бы использовать .RenderAction() и передать модель или форму коллекции, полученной .Save() в качестве параметра.

Или, на стороне сервера, просто создайте экземпляр контроллера категории и вызовите его метод .SaveAll(), снова передав модель, полученную .Save() в качестве параметра.

Однако вам придется принять результат этого вызова и убедиться, что он правильно обработан результирующим представлением.

Если это то, что вы пытаетесь сделать, стоит отметить, что вы действительно должны иметь код метода .SaveAll(), который выполняет сохранение, разделенное на выделенный бизнес-логический уровень, вместо того, чтобы жить в контроллере. Вся эта функциональность должна теоретически быть доступной для использования в другом контроллере или в библиотеке, которая может быть включена в другие приложения.

+0

Согласен, BLL - это место для этого. –

+0

Если вы тестируете свои контроллеры, то ваши контроллеры слишком много делают. –

5

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

+0

Репозиторий не является моей целью здесь ... извините – AndreMiranda

+0

+1 за высказывание «рефакторинга», для которого я взял целый абзац. –

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

0

возвращение RedirectToAction («ViewService», «Администратор»)

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

Смежные вопросы