0

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")
}

テストの結果。 RegioLevelId は 0 で、1 または 2 である必要があります

リスクからの結果。 RiskFrequencyId から RiskType2Id までは 0 であり、1 または 2 である必要があります

4

1 に答える 1

0

十分な担当者がいれば、これをコメントとして残していたでしょう。ただし、答えとして暗闇の中でのショットとして:

コントローラーは CreateTestWithRisk モデルをビューに適切に渡していますか? つまり、まだ TestController を使用していて、新しいモデルを使用することを期待していますか? 質問にコントローラー名などを明記していないので見づらいです。

これは、タイプ CreateTestWithRisk のデータがコントローラーに返されない理由を説明しています。

于 2012-11-11T12:31:29.457 に答える