Stark typisierte ViewModel in der POST-action-Methode enthält nur null-Werte

Ich versuche zu implementieren ist meine Edit-action-Methoden mit stark typisierten view empfängt Sie eine benutzerdefinierte-förmigen ViewModel-Klasse. In anderen Worten, ich möchte eine stark typisierte ViewModel enthält die Linq-Entität, die geändert werden sollen plus ein paar andere Objekte, die angezeigt werden soll, in den Blick.

Ich kann sehen, dass die Ansicht beim Aufruf der GET-Aktion Bearbeiten Methode, aber die stark typisierte POST-action-Methode erhält nur eine ViewModel-Klasse mit null-Parameter, und ich kann nicht herausfinden, wie das abrufen der POST-Parameter.

View-Modell sieht wie folgt aus:

//my custom-shaped ViewModel
public class CustomersFormViewModel
{
    public SelectList AccountTypesDropDownBox;
    public SelectList CountriesDropDownBox;
    public Customer Customer;
}

Die action-Methode sieht wie folgt aus:

//
//GET: /CustomersController/Edit   

public ActionResult Edit(int ID)
{
   var model = new CustomersFormViewModel
                    {
                        Customer = repository.Load(ID.Value),
                        CountriesDropDownBox = GetCountries(),
                        AccountTypesDropDownBox = GetAccountTypes()
                    };
    return View(model);
}

//
//POST: /CustomersController/Edit  

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(CustomersFormViewModel model)
{
    //THE NEXT LINE THROWS!!!
    Debug.Assert(Model.Customer!=null);
    return View(model);
}

- Und dies ist meine Ansicht Bearbeiten:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/CustAdminMaster.master"
    Inherits="System.Web.Mvc.ViewPage<Zeiterfassung.Controllers.CustomersController+CustomersFormViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    NewEdit
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>
        NewEdit</h2>
    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
    <% using (Html.BeginForm())
       {%>
    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="FirstName">FirstName:</label>
            <%= Html.TextBox("FirstName",Model.Customer.FirstName) %>
            <%= Html.ValidationMessage("FirstName", "*") %>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
    <% } %>
    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>
</asp:Content>

Ich habe auch versucht, eine POST-action-Methode mit formValues Parameter, aber das viewmodel noch nicht enthalten, die geposteten Parameter:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int ID, FormCollection formValues)
{
      CustomersFormViewModel model = new CustomersFormViewModel();            
      UpdateModel(model);
      //THE NEXT LINE STILL THROWS
      Debug.Assert(model.Customer!=null);
      return View("NewEdit",model);
}

Die einzige Möglichkeit, die ich gefunden habe bisher ist ein eigener code, greifen die geposteten Parameter aus der FormCollection und Aktualisierungen meine eigene ViewModel entsprechend. Aber dieser Ansatz scheint ein bisschen primitiv. Gibt es wirklich keinen besseren Weg, dies zu tun?

EDIT: ich habe einfach versucht, eine andere syntax in der Ansicht als tvanfosson vorgeschlagen, aber das problem bleibt unverändert:

<label for="Customer.FirstName">FirstName:</label>
    <%= Html.TextBox("Customer.FirstName") %>
    <%= Html.ValidationMessage("Customer.FirstName", "*") %>
Schreibe einen Kommentar