Можно ли "перенести" запрос ASP.NET MVC от одного действия к другому? - PullRequest
1 голос
/ 26 августа 2009

Предположим, у меня есть следующие действия:

public ActionResult DoSomething()
{
    // Some business logic
    return RedirectToAction("AnotherAction", RouteData.Values);
}

public ActionResult AnotherAction(string name, int age)
{
   ...
}

И следующая форма:

<form method="post" action="DoSomething">
    <input name="name" type="text" />
    <input name="age" type="text" />
    <input type="submit" value="Go" />
</form>

Нажатие кнопки «Отправить» в этой форме приведет к действию DoSomething , а затем к AnotherAction - передаче всех соответствующих значений в name и возраст . Это работает удовольствие!

Но Я, очевидно, не могу получить доступ к любым другим отправленным значениям формы в AnotherAction , потому что они теряются при перенаправлении из DoSomething:

public ActionResult AnotherAction(string name, int age)
{
   // This won't work
   var other = Request.Form["SomeDynamicVariable"];
}

Что было бы более идеальным, так это метод TransferToAction , который повторно запускает механизм MVC, "воображая", что форма была отправлена ​​на AnotherAction вместо:

return TransferToAction("AnotherAction");

Могу ли я сделать это?

Если эта функциональность недоступна "из коробки", я сделаю это, опубликую ее и опубликую!

Ответы [ 4 ]

1 голос
/ 02 сентября 2009

действия вашего контроллера также являются действительными общедоступными функциями так что вы можете сделать это

public ActionResult DoSomething(){    
// Some business logic    
// Get Params from Request
      return AnotherAction(name, age);
}

public ActionResult AnotherAction(string name, int age){
   ...
}

когда вы теперь обращаетесь к объекту Request из AnotherAction, он все тот же, потому что вы, очевидно, не сделали еще один запрос.

1 голос
/ 26 августа 2009

Используйте конструкцию TempData для хранения Request.Form. TempData используется только для данного запроса, поэтому он будет очищен после завершения обработки.

public ActionResult DoSomething()
{
    // Some business logic
    TempData["PostedFormValues"] = Request.Form;
    return RedirectToAction("AnotherAction", RouteData.Values);
}

public ActionResult AnotherAction(string name, int age)
{
   ...
   if (TempData["PostedFormValues"] != null)
   {
       //process here
   }
}
0 голосов
/ 10 апреля 2013

Вы можете передать состояние модели, используя временные данные. Наличие нескольких FilterAttributes действительно упростит процесс, и это действительно просто.

Вы должны прочитать http://ben.onfabrik.com/posts/automatic-modelstate-validation-in-aspnet-mvc для правильного использования атрибутов фильтра. Кроме того, этот блог содержит много информации об использовании правильных манипуляций mvc с состоянием модели и паттерном PRG.

Это более широкий ответ не только для вашего конкретного случая, но оно того стоит.

0 голосов
/ 02 сентября 2009

Один из способов сделать это - вызвать второе действие из первого действия и зафиксировать ответ. Это не тривиально, , как обсуждается здесь .

...