MVC-View-ViewModel-HttpPost Rückgabewert ist immer NULL
Ich bin vorbei ein ViewModel-wieder aus meiner Sicht der Controller über ein Formular HttpPost. Aber die Werte sind immer NULL.
ViewModel
public class vmCompanyAddress
{
public StatelyTechAdmin.Models.Company Company { get; set; }
public StatelyTechAdmin.Models.CompanyAddress Address { get; set; }
public SelectList Counties { get; set; }
}
Unternehmen Klasse Modell
public class Company
{
[Key]
public virtual long CompanyId { get; set; }
[Required]
[Display(Name = "Company Name")]
public virtual string Name { get; set; }
public virtual DateTime CreatedDate { get; set; }
public virtual IEnumerable<CompanyAddress> CompanyAddresses { get; set; }
}
CompanyAddress-Klasse Modell
public class CompanyAddress
{
[Key]
public virtual long CompanyAddressId { get; set; }
[Required]
public virtual long CompanyId { get; set; }
[ForeignKey("CompanyId")]
public virtual Company Company { get; set; }
[Required]
public virtual int CopmanyAddressTypeId { get; set; }
[ForeignKey("CopmanyAddressTypeId")]
public virtual CompanyAddressType CompanyAddressType { get; set; }
[Display(Name = "Address 1")]
public virtual string Address1 { get; set; }
[Display(Name = "Address 2")]
public virtual string Address2 {get; set; }
[Display(Name = "Town")]
public virtual string Town { get; set; }
[Display(Name = "City")]
public virtual string City { get; set; }
[Required]
public virtual long CountyId { get; set; }
[ForeignKey("CountyId")]
[Display(Name = "County")]
public virtual County County { get; set; }
[Required]
[Display(Name = "Postal Code")]
public virtual string PostalCode { get; set; }
public virtual DateTime CreatedDate { get; set; }
}
Controller (get):
//GET: /Company/Create
public ActionResult Create()
{
vmCompanyAddress vm = new vmCompanyAddress();
vm.Counties = new SelectList(db.County, "CountyId", "Name", -1);
//vm.Address = new CompanyAddress();
//vm.Company = new Company();
return View(vm);
}
Controller (post):
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(vmCompanyAddress company)
{
if (ModelState.IsValid)
{
db.Companies.Add(company.Company);
//Amend Address Company & Address Type before save to DB
company.Address.CompanyId = company.Company.CompanyId;
company.Address.CopmanyAddressTypeId = 1;
db.CompanyAddress.Add(company.Address);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(company);
}
View (erstellen)
@model StatelyTechAdmin.ViewModels.vmCompanyAddress
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Company</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Company.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.Name)
@Html.ValidationMessageFor(model => model.Company.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CreatedDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.CreatedDate)
@Html.ValidationMessageFor(model => model.Company.CreatedDate)
</div>
@* Invoice Address *@
<div class="editor-label">
@Html.LabelFor(model => model.Address.Address1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address.Address1)
@Html.ValidationMessageFor(model => model.Address.Address1)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Address.Address2)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address.Address2)
@Html.ValidationMessageFor(model => model.Address.Address2)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Address.Town)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address.Town)
@Html.ValidationMessageFor(model => model.Address.Town)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Address.City)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address.City)
@Html.ValidationMessageFor(model => model.Address.City)
</div>
@*<div class="editor-label">
@Html.LabelFor(model => model.Address.County)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Address.CountyId, Model.Counties)
</div>*@
<div class="editor-label">
@Html.LabelFor(model => model.Address.PostalCode)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address.PostalCode)
@Html.ValidationMessageFor(model => model.Address.PostalCode)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
Kann bitte jemand Rat, warum meine Rückkehr ViewModel-Werte sind NULL, wenn alle Felder gefüllt sind?
Ich habe im Google Chrome browser über das Netzwerk-Aufnahmefunktion und alle Werte WERDEN zurück gebucht im JSON-format.
Vielen Dank.
------------ BEARBEITEN ---------------
Hier ist ein Teil von dem, was ich sehen kann, aus den Google-Chrome-Netzwerk-Monitor
Unternehmen.Name:ABC123
Unternehmen.CreatedDate:2014/05/13 00:00:00
....
Also es ist auf jeden Fall zurückgegeben werden.
CompanyAddressTypeId geschrieben ist falsch. Versuchen Sie auch, die Definition Ihrer form wie dieses - Html.BeginForm("yourControllerNameHere", "Erstellen", FormMethod.Post)
Danke @ErikElkins die Beseitigung Firma.Name aus meiner Sicht nicht einen Unterschied machen. Alles noch Beiträge zurück als NULL.
Ich habe versucht, die Änderung der BeginForm(), aber es hat nicht funktioniert. Vielen Dank für die Eingabe und weist auf die Rechtschreibfehler.
Ist die Aktion, die Treffer in den debugger? Sie registrieren jede Besondere Bindung Filter?
InformationsquelleAutor RobHurd | 2014-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich in der Lage zu reproduzieren Sie Ihr Problem und war verwirrt, weil ich weiß, dass das Standard-MVC-Modell-Binder versteht komplexe Typen. Streifte ich die meisten code und habe einfach versucht, es zu tun mit dem Unternehmen Objekt, das noch nicht. Dann bemerkte ich, dass in vmCompanyAddress, dass der name der Klasse auch der name der Eigenschaft:
Änderte ich den Namen der Eigenschaft, auf etwas anderes aus den Namen der Klasse und es begann:
Sie sind sehr willkommen. Obwohl der compiler es zulässt, bin ich kein großer fan der Namensgebung meiner Eigenschaften der gleiche wie der name der Klasse, die Sie definiert sind. Ich den Klassennamen als reservierte Wörter, und sollte daher keine Verwirrung, wenn die Referenzierung der Klasse vs eine Instanz der Klasse.
InformationsquelleAutor Matthew at Critical Cognition
Wir hatten das gleiche problem heute. Die akzeptierte Antwort in dieser Frage ist nur ein dirty workaround für das eigentliche problem.
Klassenname und PropertyName in einem form-Modell können die gleichen sein, es gibt keine Beschränkung im Modell binder. Die Beschränkung der parameter der action in deinem controller. Sie müssen nicht die Namen der parameter wie eine Eigenschaft mit komplexen geben, die in Ihrer form das Modell. Ursache der binder wird versuchen, binden Sie die HTTP-POST-form-Wert von
company
dieser Parameter im controller. Es wird nicht für Sie arbeiten, führen Sie den binder zu binden versucht, die Werte einerCompany
TypCompanyAddress
geben.Um Ihr problem zu beheben, müssen Sie einfach benennen Sie die parameter
company
zucompanyAddressModel
- oder alles, was ist, nicht eine Eigenschaft in Ihrem Modell-Klasse.änderung:
Siehe hier für weitere Informationen über Modell-Bindung: http://aspnetmvc.readthedocs.org/projects/mvc/en/latest/models/model-binding.html
Ein gutes Beispiel aus ASP.NET WebAPI Dokumentation, die mit der gleichen Technik:
Hier die
Id
Eigenschaft vonProduct
zugeordnet istid
parameter in die controller. Die arbeiten werden, verursachen in der Aktion die gleichen primitiven Datentyp verwendet wird, wie in der Modell-Klasse.InformationsquelleAutor Martin Lantzsch
Habe nicht versucht, diese selbst aber hatte eine Menge ähnliche Probleme, vor langer Zeit, die ich gelöst mit benutzerdefinierten ModelBinder:s-die kann ich nicht empfehlen.
Ich denke mal, deine Daten nicht so aussieht: { Company: {...}, Address: {...} }?
Ich denke, die Lösung ist, um MVC zu verstehen, die Struktur der Daten mit Hilfe von Vorlagen und "EditorFor" (). Sehen http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/ für ein gutes Beispiel!
InformationsquelleAutor Fredrik C
Sicherzustellen, dass Ihr ViewModel ist die Offenlegung Eigenschaften und nicht nur nach Feldern.
Dies funktioniert:
Diese nicht:
InformationsquelleAutor Lodlaiden