MVC アプリケーションを開発しています。
リスク作成用とテスト作成用の 2 つのコントローラーがありました。
最初にリスクを作成する必要があり、テストを作成するときに、作成したリスクを新しいテストのフィールドとして使用する必要がありました。選択できるドロップダウンリストがありました。
1 つのテストには 1 つのリスクがあるため、同じページで両方を作成することになっています。つまり、1 つのテストを作成するときは、そのテストに属し、他のテストでは使用できない独自のリスクを作成する必要があります。 . ビジネスルール。
そこで、テストとリスクの両方を含む新しいモデルを作成し、作成ページのモデルを変更し、作成ページにリスクの作成を含めました。
正常に動作しているように見えますが、コントロールに戻ると、すべてのドロップダウン リストの値が失われます。それを除いて、他のすべては正常に機能します。
これが私のモデルです
using CTTModel;
namespace MvcApplication1.ViewModels
{
public class CreateTestWithRisk
{
public Test Tests { get; set; }
public Risk Risks { get; set; }
}
}
面白いことに、最初のバージョンでこのモデルを使用しようとすると、リスクとテストは別々に作成され、テストではなくリスクで機能します。つまり、リスクのすべてのドロップダウンリストは値を返し、テストの作成では値を返しません。変。
ここにコントローラーからのコードがあります
//
// GET: /Test/Create
public ActionResult Create()
{
// Risk
ViewBag.SubProcessId = new SelectList(_db.SubProcesses, "Id", "Name");
ViewBag.RiskSeverityId = new SelectList(_db.RiskSeverities, "Id", "Name");
ViewBag.RiskFrequencyId = new SelectList(_db.RiskFrequencies, "Id", "Name");
ViewBag.RiskRatingId = new SelectList(_db.RiskRatings, "Id", "Name");
ViewBag.RiskType1Id = new SelectList(_db.RiskType1, "Id", "Name");
ViewBag.RiskType2Id = new SelectList(_db.RiskType2, "Id", "Name");
// Test
ViewBag.RegionLevelId = new SelectList(_db.RegionLevels, "Id", "Name");
return View();
}
//
// POST: /Test/Create
[HttpPost]
public ActionResult Create(CreateTestWithRisk test)
{
if (ModelState.IsValid)
{
_db.Risks.Add(test.Risks);
Risk iD = _db.Risks.OrderByDescending(id => id.Id).FirstOrDefault();
if (iD != null)
{
test.Tests.RiskId = iD.Id;
test.Tests.Risk = test.Risks;
}
_db.Tests.Add(test.Tests);
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.RegionLevelId = new SelectList(_db.RegionLevels, "Id", "Name");
//ViewBag.RiskId = new SelectList(_db.Risks, "Id", "Name", test.Tests.RiskId);
ViewBag.SubProcessId = new SelectList(_db.SubProcesses, "Id", "Name");
ViewBag.RiskSeverityId = new SelectList(_db.RiskSeverities, "Id", "Name");
ViewBag.RiskFrequencyId = new SelectList(_db.RiskFrequencies, "Id", "Name");
ViewBag.RiskRatingId = new SelectList(_db.RiskRatings, "Id", "Name");
ViewBag.RiskType1Id = new SelectList(_db.RiskType1, "Id", "Name");
ViewBag.RiskType2Id = new SelectList(_db.RiskType2, "Id", "Name");
return View(test);
}
そして、これはビューからのコードの一部です
@model MvcApplication1.ViewModels.CreateTestWithRisk
@{
ViewBag.Title = "Create New Test";
}
<h2>
Create New Test</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div style="display:inline-block">
<fieldset style="float:left">
<legend>Test</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Tests.RegionLevelId, "RegionLevel")
</div>
<div class="editor-field">
@Html.DropDownList("RegionLevelId", String.Empty)
@Html.ValidationMessageFor(model => model.Tests.RegionLevelId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Tests.Code)
</div>
<div class="editor-field">
</div>
<div>
@Html.EditorFor(model => model.Tests.Code)
@Html.ValidationMessageFor(model => model.Tests.Code)
</div>
</fieldset>
<fieldset style="float:left;margin-left:10px">
<legend>Risk</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Risks.SubProcessId, "SubProcess")
</div>
<div class="editor-field">
@Html.DropDownList("SubProcessId", String.Empty)
@Html.ValidationMessageFor(model => model.Risks.SubProcessId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Risks.RiskSeverityId, "Severity")
</div>
<div class="editor-field">
@Html.DropDownList("RiskSeverityId", String.Empty)
@Html.ValidationMessageFor(model => model.Risks.RiskSeverityId)
</div>
</fieldset>
</div>
<p>
<input type="submit" value="Create" />
</p>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}