Asp.net mvc 4 我的MVC控制器没有从Html.dropdownlist获取正确的值
我正在开发一个MVC应用程序 我有两个控制器,一个用于创建风险,一个用于创建测试 我必须首先创建一个风险,当我创建一个测试时,我必须使用创建的风险作为新测试的一个字段。我有一个下拉列表可供选择 现在我应该在同一个页面中创建这两个测试,因为一个测试将有一个风险,也就是说,当我创建一个测试时,我必须创建它自己的风险,它属于该测试,不能被任何其他测试使用。商业规则 因此,我创建了一个包含测试和风险的新模型,更改了创建页面的模型,在创建页面中包含了风险创建 好的,它似乎工作得很好,但是当我回到控件时,所有的dropdownlists都失去了它们的价值。除此之外,其他一切都很好 这是我的模型Asp.net mvc 4 我的MVC控制器没有从Html.dropdownlist获取正确的值,asp.net-mvc-4,html-select,Asp.net Mvc 4,Html Select,我正在开发一个MVC应用程序 我有两个控制器,一个用于创建风险,一个用于创建测试 我必须首先创建一个风险,当我创建一个测试时,我必须使用创建的风险作为新测试的一个字段。我有一个下拉列表可供选择 现在我应该在同一个页面中创建这两个测试,因为一个测试将有一个风险,也就是说,当我创建一个测试时,我必须创建它自己的风险,它属于该测试,不能被任何其他测试使用。商业规则 因此,我创建了一个包含测试和风险的新模型,更改了创建页面的模型,在创建页面中包含了风险创建 好的,它似乎工作得很好,但是当我回到控件时,所
using CTTModel;
namespace MvcApplication1.ViewModels
{
public class CreateTestWithRisk
{
public Test Tests { get; set; }
public Risk Risks { get; set; }
}
}
有趣的是,如果我尝试在第一个版本中使用这个模型,风险和测试分开创建,它与风险一起工作,而不是与测试一起工作,这意味着风险中的所有dropdownlists都会返回值,而在测试创建中,它们不会。奇怪
这是来自控制器的代码
//
// 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")
}
@model mvcapapplication1.ViewModels.CreateTestWithRisk
@{
ViewBag.Title=“创建新测试”;
}
创建新测试
@使用(Html.BeginForm())
{
@Html.ValidationSummary(true)
试验
@LabelFor(model=>model.Tests.RegionLevelId,“RegionLevel”)
@DropDownList(“RegionLevelId”,String.Empty)
@Html.ValidationMessageFor(model=>model.Tests.RegionLevel ID)
@LabelFor(model=>model.Tests.Code)
@EditorFor(model=>model.Tests.Code)
@Html.ValidationMessageFor(model=>model.Tests.Code)
风险
@LabelFor(model=>model.Risks.SubProcessId,“SubProcess”)
@DropDownList(“SubProcessId”,String.Empty)
@Html.ValidationMessageFor(model=>model.Risks.SubProcessId)
@LabelFor(model=>model.Risks.RiskSeverityId,“严重性”)
@DropDownList(“riskserverityid”,String.Empty)
@Html.ValidationMessageFor(model=>model.Risks.riskserverityid)
}
@ActionLink(“返回列表”、“索引”)
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
如果我有足够的代表,我会留下这个作为评论。但是,作为一个答案,我会在黑暗中开枪: 控制器是否正确地将CreateTestWithRisk模型传递给视图?也就是说,您是否仍在使用TestController,并希望它使用新型号?很难看到,因为您没有在问题中指定控制器名称等
这将解释为什么没有CreateTestWithRisk类型的数据被传回控制器 是的,它是。数据正在返回,而不是下拉列表数据