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", "*") %>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie name, Ihre Felder im Einklang mit den Präfixen im Modell. Darüber hinaus müssen Sie ändern Sie Ihre Ansicht-Modell verwenden Sie die Eigenschaften anstelle von Feldern. Das Standard-Modell binder sieht nur die öffentlichen Eigenschaften, die auf das Modell bei verbindlich.
Weise, dass es das Modell binder weiß, wie ordnen Sie den form-parameter mit der entsprechenden Komponente und die zugehörige Eigenschaft des Modells.
Seine schon eine Weile aber da gibt es wirklich noch nicht eine Antwort auf diese ein.
War die Manipulation mit dem gleichen problem, bis ich heute das auto-Eigenschaft auf meinem viewmodel mit einem privaten Satz.
Suchen, um Ihre viewmodel Ihnen fehlt die auto-properties get und Set-Methoden, alle zusammen!
So ändern Sie Ihr viewmodel entsprechend:
Versuchen
Und auch nehmen Sie einen Blick hier :
UpdateModel Präfix - ASP.NET MVC
Wenn es immer noch nicht funktioniert, setzen Sie einen breakpoint nach UpdateModel. Wenn Sie das nicht tun den job, versuchen, in Schnellüberwachung(Strg+alt+q) mit verschiedenen Kombinationen von aufrufen UpdateModel.
Wenn es noch hat nicht funktioniert , schließen Sie das Quell-und debug ein bisschen :). Du wirst etwas neues lernen und dann erzählen Sie uns davon :). Dann ist jeder glücklich.
Glück.