MVC3 ModelState недействителен на HttpPost - PullRequest
2 голосов
/ 17 февраля 2012

У меня проблема с тем, что модель действительна при создании страницы HttpGet, но недействительна (некоторые свойства имеют значение null) на HttpPost.

Вот мой призыв открыть страницу:

            var quote = new Quote
            {
                Agency = assignedAgency,
                Insured = insured,
                RiskAddress = insured.Address
            };
            db.Quotes.Add(quote);
            db.SaveChanges();

            return RedirectToAction("Edit", "Quote", quote.QuoteID);  

И HttpGet ActionResult - На данный момент модель действительна.Свойства Застрахованного и Агентства заполняются, а их соответствующие свойства Адреса также заполняются.

    [HttpGet]
    public ActionResult Edit(int quoteID)
    {
        var model = db.Quotes.Find(quoteID);

       return View(model);
    }

И HttpPort ActionResult - При входе этого метода Застрахованный, Агентство и их соответствующие свойства Адреса равны нулю, что приводит кнедопустимое состояние модели.

    [HttpPost]
    public ActionResult Edit(Quote model)
    {
        if (ModelState.IsValid)
        {
            if (model.SubCosts > 0)
            {
                model.InsuredSubs = true;
                model.SubClassCode = "95626 - Subcontractor - TEST CLASS";
                model.SubClassExposure = model.SubCosts;
            }

            db.Entry(model).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Edit", new { quoteID = model.QuoteID });
        }
        return View(model);
    }

И HTML:

 @model DomaniOnline.Models.DomaniData.Quote

 @{
     ViewBag.Title = "Classification";
  }

  <h2>General Liability Classification</h2>

  @using (Html.BeginForm())
   {
     @Html.ValidationSummary(true)
     <fieldset>

    @Html.HiddenFor(model => model.QuoteID)
    @Html.HiddenFor(model => model.Insured)
    @Html.HiddenFor(model => model.Insured.Address)
    @Html.HiddenFor(model => model.RiskAddress)
    @Html.HiddenFor(model => model.Agency)
    @Html.HiddenFor(model => model.Agency.Address)

        .
        .
        .
        .
    <p>
        @Html.ActionLink("Back to Insured Info", "Edit", "Insured", new { insuredID = Model.Insured.InsuredID }, null)
        <input type="submit" value="Save & Continue" />
    </p>
</fieldset>
}

Я хотел бы отметить, что ActionLink «Назад к застрахованной информации» внизу страницы работаетпросто отлично и может предоставить правильную модель. Insured.InsuredID.Но по какой-то причине при отправке формы в HttpPost любое свойство, имеющее пользовательский тип данных, имеет значение null.Html.HiddenFor <> были добавлены в качестве теста при попытке заставить это работать.

edit: Classes:

 public class Quote
 {
    public virtual int QuoteID { get; set; }
    public virtual Address RiskAddress { get; set; }
    public virtual Agency Agency { get; set; }
    public virtual Insured Insured { get; set; }

    public virtual DateTime PropEffDate { get; set; }
    public virtual bool InsuredSubs { get; set; }
    public virtual int SubCosts { get; set; }
    .
    .
    .
  }
  public class Address
  {
    [Required]
    public virtual string StreetAddress { get; set; }
    [Required]
    public virtual string City { get; set; }
    [Required]
    public virtual string State { get; set; }
    [Required]
    public virtual string ZipCode { get; set; }
  }
  public class Insured
  {
    public virtual int InsuredID { get; set; }
    [Required]
    public virtual string Name { get; set; }
    [Required]
    public virtual Address Address { get; set; }
    public virtual string DBA { get; set; }
    [Required]
    public virtual string BusinessType { get; set; }
    public virtual string Phone { get; set; }
  }

1 Ответ

1 голос
/ 17 февраля 2012

Ваша проблема в том, что вы используете HiddenFor для сложных типов. Это только знает, как визуализировать простые типы.

Я бы предложил либо только сохранить идентификаторы этих объектов, либо использовать вспомогательную функцию Html.Serialize из проекта MVC Futures для сериализации вашей учетной записи и застрахованных объектов, а затем десериализовать их в вашем контроллере.

http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx

Постоянным идентификатором должен быть только InsuredID, из которого вы можете повторно получить Застрахованного и его адрес при обратной передаче. То же самое с агентством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...