MVC Rest и возврат представлений

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

public class MyController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

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

    [HttpPost]
    public ActionResult Create(MyModel model)
    {
        if(!ModelState.IsValid)
        {
             // Want to return view "new" but with existing model
        }

        // Process my model
        return RedirectToAction("Index");
    }
}

person Scott Mackay    schedule 17.07.2011    source источник


Ответы (2)


Просто:

[HttpPost]
public ActionResult Create(MyModel model)
{
    if(!ModelState.IsValid)
    {
        return View("New", model);
    }

    // Process my model
    return RedirectToAction("Index");
}
person Darin Dimitrov    schedule 17.07.2011

Конечно, я не знаком с соглашениями REST, поэтому я могу быть здесь далеко... (и я не смог найти источник, в котором говорилось, что метод New() должен быть без параметров через несколько минут поиска в Google)

Вы можете изменить свой метод New() на

public ActionResult New(MyModel model = null)
{
    return View("New", model);
}

А затем в вашем Create()

    if(!ModelState.IsValid)
    {
         return New(model)
         // Want to return view "new" but with existing model
    }

И проверьте в новом представлении, установлена ​​ли модель или нет. New() по-прежнему будет отлично работать без параметра, как раньше.

person Dirk van Bergen    schedule 17.07.2011
comment
-1, это вызывает действие New, не говоря уже о том, что оно не будет работать, поскольку вы находитесь в контексте действия Create, которое будет искать представление Create.cshtml. - person Darin Dimitrov; 17.07.2011
comment
Разве не этого он хочет? - person Dirk van Bergen; 17.07.2011
comment
нет, это не то, чего он хочет. Он хочет визуализировать представление New из действия Create, а не вызывать действие New. Есть разница. См. мой ответ. - person Darin Dimitrov; 17.07.2011
comment
Я знаю это. Мне просто не особенно нравится возвращать разные представления из разных действий. В действии, требуемом представлением, может быть логика, которую в противном случае можно было бы пропустить. Я предпочитаю обрабатывать такую ​​ситуацию, вызывая New, но с моделью, а затем в логике проверяя, является ли модель нулевой или нет. - person Dirk van Bergen; 17.07.2011
comment
это неправильный шаблон. Обычно в действии GET у вас есть код, который извлекает модель из БД, тогда как в действии POST эта модель поступает из связывателя модели по умолчанию в качестве пользовательского ввода. Если вы вызовете действие GET, вернув его, вы потеряете то, что пользователь ввел в форму. И, как я уже сказал, ваш код не будет работать, потому что он не найдет представление Create.cshtml. В новом действии вам нужно будет return View("New", model);. - person Darin Dimitrov; 17.07.2011
comment
Теперь лучше? :) Я не понимал, что Create все равно будет искать Create.cshtml, если я верну другое действие. Я еще ни разу не сталкивался с этой проблемой. - person Dirk van Bergen; 17.07.2011
comment
нет, не лучше и я уже объяснил почему. По крайней мере, на этот раз ваш код будет работать, но это плохой шаблон. - person Darin Dimitrov; 17.07.2011