ビューで次のコントロールを取得しました。
<div class="editor-label">
@Html.LabelFor(model => model.Number)
</div>
<div class="editor-field">
@Html.HiddenFor(model => model.Number)
@Html.TextBoxFor(model => model.Number, new { disabled = "disabled" })
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ProjectID)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Project.ID, Model.ProjectList, "Select", new { onchange = "SelectedIndexChanged()" })
</div>
モデルの数値フィールドを生成するためにドロップダウンリストの値が変更されたときにフォームを送信すると、ビューがリロードされます。HiddenFor コントロールがない場合、モデルの Number が TextBoxFor に正しく表示されます。HiddenFor コントロールを追加すると、Model.Number は null ではありませんが、Number フィールドが表示されません。
これの理由は何ですか?
Number 値を持つ HiddenFor が必要な理由は、フォームを送信して保存するときに、model.Number が null に等しいからです。値を HiddenFor に入れることで、アクセスできると思いました...
編集:コントローラーメソッド
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateOpportunity(CreateEditOpportunityModel model)
{
// if the submit is made by the ddl
if (model.SubmitValue.Equals("ChangeProject"))
{
Project parentProject = pCtx.Projects.Find(model.Project.ID);
if (parentProject != null)
{
// Generate the "Number field"
Region projectRegion = rCtx.Regions.Find(parentProject.RegionID);
int numOpportunity = oCtx.Opportunitites.Count(o => o.ProjectID == parentProject.ID);
numOpportunity++;
string oppNumber = numOpportunity < 10 ? "0" + numOpportunity : numOpportunity.ToString();
model.Number = projectRegion.Name + "-" + parentProject.ID + "-" + oppNumber;
}
// Repopulate the ddl
model.ProjectList = new SelectList(pCtx.Projects, "ID", "ID");
return View(model);
}
// if submit is made by the save button
else if (model.SubmitValue.Equals("CreateOpportunity"))
{
if (ModelState.IsValid)
{
Opportunity opportunity = new Opportunity();
opportunity.ID = model.ID;
opportunity.Number = model.Number;
opportunity.ActivationDate = model.ActivationDate;
opportunity.Assignee = model.Assignee;
opportunity.Comments = model.Comments;
opportunity.CreationDate = DateTime.Now;
opportunity.LicenseFilePath = model.LicenseFilePath;
opportunity.LicenseRequestFilePath = model.LicenseRequestFilePath;
opportunity.OkPermanentStatus = model.OkPermanentStatus;
opportunity.PaidStatus = model.PaidStatus;
opportunity.PartNumber = model.PartNumber;
opportunity.Project = pCtx.Projects.Find(model.Project.ID);
//tell EF that Project already exists in Company table
oCtx.Entry(opportunity.Project).State = EntityState.Modified;
// Saves project
oCtx.Opportunitites.Add(opportunity);
oCtx.SaveChanges();
return RedirectToAction("Index");
}
model.ProjectList = new SelectList(pCtx.Projects, "ID", "ID");
return View(model);
}
model.ProjectList = new SelectList(pCtx.Projects, "ID", "ID");
return View(model);
}
コードのこの部分は正常に動作します。わかりやすくするためにここに記載しています。