ASP.NET MVC: как отобразить другое действие (не представление) с моделью?

Вернуть другой вид из контроллера очень просто:

return View("../Home/Info");

Однако мне нужна модель в информационном представлении. У меня много чего происходит в методе результата действия Info(). Я могу просто скопировать его и получить что-то вроде этого:

var infoModel = new InfoModel {
    // ... a lot of copied code here
}
return View("../Home/Info", infoModel);

Но это неразумно.

Конечно, я могу просто перенаправить:

return RedirecToAction("Info");

Но таким образом URL-адрес изменится. Я не хочу менять URL. Это очень важно.


person Alex    schedule 19.11.2011    source источник


Ответы (3)


Похоже, вы хотите вызвать действие из другого контроллера. Я бы посоветовал вам просто отобразить представление, которое отображает это действие, используя Html.Action() вместо того, чтобы пытаться связать их вместе в контроллере. Если это неразумно, вы можете создать базовый контроллер, из которого могут быть получены оба контроллера, и поместить общий код для создания модели в базовый контроллер. Повторно используйте представление по мере необходимости.

  public ActionResult Foo()
  {
      return View();
  }

Фу Вид

  @Html.Action( "info", "home" ) 
person tvanfosson    schedule 19.11.2011
comment
Спасибо! Просто маленькое не: @{ Html.RenderAction(...); } лучше с точки зрения производительности. - person Alex; 20.11.2011
comment
делает именно то, что я хотел, не думал об этом. - person jeremy; 21.06.2012

Вы можете вызвать право на другое действие из действия, например:

public ActionResult MyAction(){
   if(somethingOrAnother){
      return MyOtherAction();
   }
   return View();
}

//"WhichEverViewYouNeed" is required here since you are returning this view from another action
//if you don't specify it, it would return the original action's view
public ActionResult MyOtherAction(){
    return View("WhichEverViewYouNeed", new InfoModel{...});
}
person Andrew Barber    schedule 19.11.2011
comment
Представление будет соответствовать действию, которое было вызвано изначально, если вы явно не укажете, какое представление вы хотите. - person tvanfosson; 20.11.2011
comment
@tvanfosson Его вопрос предполагает, что он уже собирается указать представление. - person Andrew Barber; 20.11.2011
comment
Да, но в вашем примере он все равно будет искать представление MyAction, даже если вызывается MyOtherAction. Вам нужно будет сделать return View( "MyOtherAction", new InfoModel { ... } );, если вы всегда хотели отображать представление, которое сопровождает его. - person tvanfosson; 20.11.2011
comment
@tvanfosson Ах, да; Я не понимал, что не делаю то же самое в моем примере. Я исправлю это сейчас. - person Andrew Barber; 20.11.2011
comment
Такое простое решение! Никогда не думал об этом. Единственное (и я сожалею, что забыл упомянуть об этом) заключается в том, что другое действие находится в другом контроллере. Могу ли я просто вызвать новый HomeController().MyOtherAction()? - person Alex; 20.11.2011
comment
Нет, вы не можете (не должны) просто так делать. Посмотрите ответ тванфоссона, чтобы узнать, как это сделать проще всего. - person Andrew Barber; 20.11.2011

Почему бы просто не вызвать метод действия?

person Daniel A. White    schedule 19.11.2011
comment
Он говорит, что не хочет, чтобы URL менялся. (Мое самое большое разочарование в MVC заключается в том, что люди стали одержимы URL-адресами, часто бессмысленно.) Вероятно, здесь сработает частичное представление. - person Ryan; 20.11.2011
comment
@Ryan Вызов другого метода действия, как в моем ответе, не изменит URL-адрес. И я не думаю, что именно MVC заставил людей зациклиться на том, чтобы не менять URL-адреса; выполните поиск Server.Transfer и также увидите много одержимости WebForms. - person Andrew Barber; 20.11.2011