views:

160

answers:

2

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(personID);

        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>" %>

<% using (Html.BeginForm()) {%> <%= Html.ValidationSummary(true) %>

    <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; }
}

}

+1  A: 

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) %>
Darin Dimitrov
No luck with that unfortunately. I added it but am still getting a 0 ID passed back
Paul Connolly
The action that is rendering the form needs to populate it.
Darin Dimitrov
Doesn't the "vm.Person = personToEdit;" line in the "ActionResult EditPerson(personID) action do that for me?It shows in the debugger that it is passing its proper real integer through to the view, could that be showing me wrong info?
Paul Connolly
Thanks for the answer, it got me some of the way there. All I needed then was to remove the Bind exclude et viola!
Paul Connolly
+1  A: 

Remove

[Bind(Exclude = "ID")] 

from you model class.

mare
Job done! thanks!
Paul Connolly