2012-11-10 42 views
0

我正在开发一个MVC应用程序。我的MVC控制器没有从Html.dropdownlist得到正确的值

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

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

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

因此,我创建了一个包含Test和Risk的新模型,更改了创建页面的模型,并在创建页面中添加了Risk创建。

好吧,它似乎工作正常,但所有的dropdownlists失去了他们的价值,当我回到控制。其他一切正常,除此之外。

这里是我的模型

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

Results from Test. RegioLevelId is 0 and should be 1 or 2

Results from Risks. From RiskFrequencyId to RiskType2Id is 0 and should be 1 or 2

回答

0

我早就离开这个作为如果我有足够的代表,请发表评论。然而,作为一个在黑暗中作为答案的镜头:

您的控制器是否正确地将CreateTestWithRisk模型传递给View?即你还在使用TestController并期待它使用新模型吗?很难看,因为你没有在你的问题中指定控制器名称等。

这将解释为什么没有将类型CreateTestWithRisk的数据传回控制器。

+0

是的,它是。数据回来了,只是没有dropdowlist数据 –

相关问题