Sto passando un ViewModel indietro dalla mia vista al controller tramite un modulo HttpPost. Tuttavia, i valori restituiti sono sempre NULL.MVC View ViewModel HttpPost il valore restituito è sempre NULL
ViewModel
public class vmCompanyAddress
{
public StatelyTechAdmin.Models.Company Company { get; set; }
public StatelyTechAdmin.Models.CompanyAddress Address { get; set; }
public SelectList Counties { get; set; }
}
società Class Modello
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 Classe Modello
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 (ottenere):
// 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 (creare)
@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>
}
Qualcuno può offrire qualche consiglio da perché i miei valori ViewModel restituiti sono NULL quando vengono compilati tutti i campi?
Ho controllato il browser Google Chrome utilizzando la funzione Record di rete e tutti i valori SONO registrati in formato JSON.
Molte grazie.
------------ EDIT ---------------
Ecco parte di quello che posso vedere dal Chrome Rete Google monitorare
Company.Name:ABC123 Company.CreatedDate: 2014/05/13 00:00:00 ....
quindi è sicuramente viene restituito.
Abbastanza divertente, qualcuno ha avuto un problema simile con distacco posteriore "Company.Name". Per divertimenti, prova a rimuovere quel campo e vedere se registra ancora tutto null. http://stackoverflow.com/questions/780026/asp-net-mvc-model-binding-returning-null-values –
CompanyAddressTypeId è scritto erroneamente. Inoltre, prova a definire il tuo modulo in questo modo: Html.BeginForm ("yourControllerNameHere", "Create", FormMethod.Post) – JB06
Grazie a @ErikElkins tuttavia, rimuovere Company.Name dalla mia vista non ha fatto la differenza. Tutto torna ancora come NULL. – RobHurd