I pass a ViewModel (which contains a "Person" object) from the "EditPerson" controller action into the view. When posted back from the view, the ActionResult receives all of the Person properties except the ID (which it says is zero instead of say its real integer)
Can anyone tell me why?
The controllers look like this:
public ActionResult EditPerson(int personID)
{
var personToEdit = repository.GetPerson(perso开发者_如何学编程nID);
FormationViewModel vm = new FormationViewModel();
vm.Person = personToEdit;
return View(vm);
}
[HttpPost]
public ActionResult EditPerson(FormationViewModel model) <<Passes in all properties except ID
{
// Persistence code
}
The View looks like this:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Afp.Models.Formation.FormationViewModel>" %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.Title) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.Title) %>
<%= Html.ValidationMessageFor(model => model.Person.Title) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.Forename)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.Forename)%>
<%= Html.ValidationMessageFor(model => model.Person.Forename)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.Surname)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.Surname)%>
<%= Html.ValidationMessageFor(model => model.Person.Surname)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.DOB) %>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.DOB, String.Format("{0:g}", Model.DOB))
<%= Html.ValidationMessageFor(model => model.DOB) %>
</div>--%>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.Nationality)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.Nationality)%>
<%= Html.ValidationMessageFor(model => model.Person.Nationality)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.Occupation)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.Occupation)%>
<%= Html.ValidationMessageFor(model => model.Person.Occupation)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.CountryOfResidence)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.CountryOfResidence)%>
<%= Html.ValidationMessageFor(model => model.Person.CountryOfResidence)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.PreviousNameForename)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.PreviousNameForename)%>
<%= Html.ValidationMessageFor(model => model.Person.PreviousNameForename)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.PreviousSurname)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.PreviousSurname)%>
<%= Html.ValidationMessageFor(model => model.Person.PreviousSurname)%>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.Person.Email)%>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.Person.Email)%>
<%= Html.ValidationMessageFor(model => model.Person.Email)%>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
And the Person class looks like:
[MetadataType(typeof(Person_Validation))]
public partial class Person
{
public Person()
{
}
}
[Bind(Exclude = "ID")]
public class Person_Validation
{
public int ID { get; private set; }
public string Title { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public System.DateTime DOB { get; set; }
public string Nationality { get; set; }
public string Occupation { get; set; }
public string CountryOfResidence { get; set; }
public string PreviousNameForename { get; set; }
public string PreviousSurname { get; set; }
public string Email { get; set; }
}
And ViewModel:
public class FormationViewModel
{
public Company Company { get; set; }
public Address RegisteredAddress { get; set; }
public Person Person { get; set; }
public PersonType PersonType { get; set; }
public int CurrentStep { get; set; }
}
}
Remove
[Bind(Exclude = "ID")]
from you model class.
The ID is not posted because it is not inside the form. You could include it as a hidden field:
<%= Html.HiddenFor(model => model.Person.ID) %>
精彩评论