0

我正在开发一个 MVC 应用程序。

我有 2 个控制器,一个用于创建风险,一个用于创建测试。

我必须首先创建一个风险,当我创建一个测试时,我必须使用创建的风险作为新测试的一个字段。我有一个下拉列表可供选择。

现在我应该在同一页面中创建两者,因为一个测试将有一个风险,即,当我创建一个测试时,我必须创建自己的风险,它属于该测试并且不能被任何其他测试使用. 商业规则。

因此,我创建了一个包含测试和风险的新模型,更改了创建页面的模型,在创建页面中包含了风险创建。

好的,它似乎工作正常,但是当我回到控件时,所有下拉列表都失去了价值。其他一切都很好,除了那个。

这是我的模型

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 回答