私のドメイン モデルは、1 つ以上の CompanyAdmin エンティティを持つ Company エンティティです。
フォームの値を投稿するときに既定のモデル バインダーが機能するには、CompanyAdmin エンティティに一意の名前が必要であることがわかりました。
このページを初めて閲覧するとき、Company または CompanyAdmin のデータはありません。つまり、このコードはビューでは機能しないため、入力テキスト ボックスが表示されません。
@Html.EditorFor(model => model.Company.CompanyContacts)
したがって、それらを表示するには、次を使用します。
@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
しかし、問題は、POST 時にモデル バインディングが機能しないことです。私が見つけることができるすべての例は、既に作成されたデータを使用しています。
どうすればこれを機能させることができますか?
ビューモデル
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ContractorDirect.Models
{
public class CompanyAdminViewModel
{
public Company Company { get; set; }
public RegisterModel UserReg { get; set; }
}
}
コントローラ
public ViewResult CompanyAdmin(int? id)
{
CompanyAdminViewModel cavm = new CompanyAdminViewModel();
jobTitleRepository = new JobTitleRepository();
companyContactRepository = new CompanyContactRepository();
var jobtitles = jobTitleRepository.All;
ViewBag.JobTitleId = new SelectList(jobtitles, "JobTitleId", "JobName");
if (id.HasValue)
{
cavm.Company = companyRepository.Find((int)id);
cavm.Company.CompanyContacts = companyContactRepository.All.Where(admin=>admin.IsCompanyAdmin).ToList();
return View(cavm);
}
cavm.Company = new Company();
cavm.Company.CompanyContacts = new List<CompanyContact>();
cavm.UserReg = new RegisterModel();
return View(cavm);
}
[HttpPost]
public ActionResult CompanyAdmin(CompanyAdminViewModel cavm)
{
JobTitleRepository rep = new JobTitleRepository();
var jobtitles = rep.All;
ViewBag.JobTitleId = new SelectList(jobtitles, "JobTitleId", "JobName");
cavm.UserReg.UserName = cavm.Company.CompanyContacts.ElementAt(0).Email;
if (ModelState.IsValid)
{
AccountController account = new AccountController();
account.Register(cavm.UserReg, "CompanyAdmin");
companyRepository.InsertOrUpdate(cavm.Company);
companyRepository.Save();
return RedirectToAction("CompanyRegistrationConfirmation");
}
else
{
return View();
}
}
見る
@model ContractorDirect.Models.CompanyAdminViewModel
@{
ViewBag.Title = "CompanyAdmin";
}
<h2>Company Admin</h2>
<table>
<tr style="vertical-align: top">
<td>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CompanyName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.CompanyName)
@Html.ValidationMessageFor(model => model.Company.CompanyName)
</div>
<fieldset>
<legend>Company Administrator</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).JobTitleId)
</div>
<div class="editor-field">
@Html.DropDownList("JobTitleId", string.Empty)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
@Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).LastName)
@Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).Email)
@Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).Email)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Company.CompanyContacts.ElementAt(0).Phone)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Company.CompanyContacts.ElementAt(0).Phone)
@Html.ValidationMessageFor(model => model.Company.CompanyContacts.ElementAt(0).Phone)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserReg.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserReg.Password)
@Html.ValidationMessageFor(model => model.UserReg.Password)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserReg.ConfirmPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserReg.ConfirmPassword)
@Html.ValidationMessageFor(model => model.UserReg.ConfirmPassword)
</div>
</fieldset>
</td>
</tr>