Je passe un ViewModel de ma vue au contrôleur via un formulaire HttpPost. Cependant, les valeurs renvoyées sont toujours NULL.MVC View ViewModel HttpPost la valeur de retour est toujours NULL
ViewModel
public class vmCompanyAddress
{
public StatelyTechAdmin.Models.Company Company { get; set; }
public StatelyTechAdmin.Models.CompanyAddress Address { get; set; }
public SelectList Counties { get; set; }
}
Modèle Société Classe
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 Modèle
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 (créer)
@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>
}
Quelqu'un peut-il s'il vous plaît offrir des conseils à pourquoi mes valeurs ViewModel de retour sont NULL lorsque tous les champs sont remplis?
J'ai vérifié dans le navigateur Google Chrome en utilisant la fonction d'enregistrement réseau et toutes les valeurs sont affichées au format JSON.
Merci beaucoup.
------------ --------------- EDIT
Voici une partie de ce que je peux voir à partir du réseau Google Chrome surveiller
Company.Name:ABC123 Company.CreatedDate: 13/05/2014 00:00:00 ....
il est certainement retourné.
assez drôle, quelqu'un a eu un problème similaire avec l'affichage de retour "Company.Name". Pour les funsies, essayez de supprimer ce champ et voyez s'il publie toujours tout ce qui est nul. http://stackoverflow.com/questions/780026/asp-net-mvc-model-binding-returning-null-values –
CompanyAddressTypeId est mal orthographié. Aussi, essayez de définir votre formulaire comme ceci - Html.BeginForm ("yourControllerNameHere", "Create", FormMethod.Post) – JB06
Merci @ErikElkins cependant, supprimer Company.Name de ma vue n'a pas fait de différence. Tout est toujours comptabilisé comme NULL. – RobHurd