Возврат ActionResult из другого ActionResult - PullRequest
4 голосов
/ 19 февраля 2011

Скажем, у меня есть следующий код, смоделированный в блокноте, поэтому извините за любые незначительные ошибки:)

//Default page
public ActionResult Index()
    {
        var musicViewModel
        {
         Albums = GetTopSellingAlbums(5),
         Genres = GetTopGenres(5),
         Artists = GetTopArtists(5)
         };

        return View(musicViewModel);
    }

[HttpPost]
public ActionResult Index(MusicViewModel musicViewModel)
    {

        //For the example, pretend I have a class called musicStoreSubmission in my
        //viewmodel which holds a few different fields the user fills out.

        if(ModelState.IsValid)
        {
            //Do some actions based on the user submitting a form
        }

        //Else, refresh page with errors in Modelstate.
        var musicViewModel
        {
         Albums = GetTopSellingAlbums(5),
         Genres = GetTopGenres(5),
         Artists = GetTopArtists(5)
         };

        return View(musicViewModel);
    }

Мое беспокойство вызывает то, что для отправки любых ошибок с недопустимым ModelState мне нужно снова сгенерировать модель представления, чтобы можно было создавать любые элементы на странице, которые используют эти объекты (жанры, исполнители и т. Д.). Проблема в том, что мне нужно скопировать и вставить часть кода из ActionResult в ActionResult, что делает мой код не очень СУХИМЫМ.

Есть ли лучший способ избежать повторения подобного кода? На данный момент я просто перенес генерацию любых объектов по умолчанию, которые нужны модели представления, в отдельный метод и / или конструктор, но это немного запутанно, поскольку мне нужно сгенерировать все объекты, которые могут понадобиться для всего контроллера. Я надеялся, что смогу указать на свое второе действие индекса на первое действие индекса и просто использовать его как обычный метод. Я пробовал несколько разных способов сделать это, но не могу вернуть ActionResult в другой ActionResult.

Есть мысли?

Ответы [ 2 ]

6 голосов
/ 19 февраля 2011

Я бы предложил применить шаблон Post / Redirect / Get . Он идеально подходит для веб-приложений MVC.

Проверьте этот ответ для примера кода: ModelState.IsValid или Model.IsValid?

4 голосов
/ 19 февраля 2011

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

[HttpPost]
public ActionResult Index(MusicViewModel musicViewModel)
{
    if(ModelState.IsValid)
    {
        //Do some actions based on the user submitting a form
    }
    return MyAction();
}

, или вы можете передать опубликованную модель обратно ViewResult

[HttpPost]
public ActionResult Index(MusicViewModel musicViewModel)
{
    if(ModelState.IsValid)
    {
        //Do some actions based on the user submitting a form
    }
    return View(musicViewModel);
}

Второй подход лучше, если вы неперестроить ViewModel

...