Различные модели для Get и Post - MVC - PullRequest
9 голосов
/ 11 октября 2011

Как я понимаю из приведенного ниже вопроса, должна быть возможность использовать разные модели для действий Get и Post.Но почему-то мне не удается добиться именно этого.

Чего мне не хватает?

Связанный вопрос: Использование двух разных моделей в действии контроллера для POST и GET

Модель

public class GetModel
{
    public string FullName;
    public string Name;
    public int Id;
}

public class PostModel
{
    public string Name;
    public int Id;
}

Контроллер

public class HomeController : Controller
{
    public ActionResult Edit()
    {
        return View(new GetModel {Id = 12, Name = "Olson", FullName = "Peggy Olson"});
    }

    [HttpPost]
    public ActionResult Edit(PostModel postModel)
    {
        if(postModel.Name == null)
            throw new Exception("PostModel was not filled correct");
        return View();
    }
}

Вид

@model MvcApplication1.Models.GetModel
@using (Html.BeginForm()) {
    @Html.EditorFor(x => x.Id)
    @Html.EditorFor(x=>x.Name)
    <input type="submit" value="Save" />
}

Ответы [ 2 ]

9 голосов
/ 11 октября 2011

Ваши модели не используют надлежащие средства доступа, поэтому привязка модели не работает.Измените их на это, и оно должно работать:

public class GetModel
{
   public string FullName { get; set; }
   public string Name { get; set; }
   public int Id { get; set; }
}

public class PostModel
{
   public string Name { get; set; }
   public int Id { get; set; }
}
6 голосов
/ 11 октября 2011

немного уточнений

Действия контроллера GET и POST могут легко использовать любые типы, которые им необходимы. На самом деле мы не говорим о моделях здесь. Модель - это набор классов / типов, которые представляют некоторое состояние / данные приложения. Следовательно приложение или данные модель.

То, что мы имеем здесь в виду:

  • Просмотр типов моделей
  • типы параметров метода действия

Итак, модель вашего приложения остается прежней. И GetModel и PostModel - это всего лишь два класса / типа в этой модели. Они не являются моделями per se.

Разные типы? Конечно, мы можем!

В вашем случае вы используете модель вида GetModel, а затем передаете ее данные в PostModel параметр действия. Поскольку оба эти класса / типа имеют свойства с одинаковыми совпадающими именами, механизм связывания модели по умолчанию сможет заполнять свойства PostModel. Если имена свойств не будут одинаковыми, вам придется изменить представление, чтобы переименовать входные данные, чтобы отразить имена свойств типа действия POST.

Вы также можете получить представление с типом GetModel и затем опубликовать действие с несколькими различными параметрами, такими как:

public ActionResult Edit(Person person, IList<Address> addresses)
{
    ...
}

Или что-нибудь еще. Вам просто нужно убедиться, что данные публикации могут быть связаны с этими параметрами и их типами ...

...