2016-12-29 78 views
1

當我打我的提交按鈕,我失去了我的創建級聯下拉列表MVC級聯下拉列表HTTP POST

控制器

public ActionResult Create() 
    { 
     ViewBag.gradeLs = GetGradeLevels();   
     return View(); 
    } 

    public SelectList GetGradeLevels() 
    { 
     var gradeLs = db.GradeLevels; 
     return new SelectList(
      gradeLs.ToArray(), 
      "GradeLevelId", 
      "GradeLevel1" 
      ); 
    } 

    [HttpPost] 
    public ActionResult GetTestsbyGradeLevelId(int gradeLevelId) 
    { 
     var listTests = GetAllTests(gradeLevelId); 
     SelectList selectListOfTests = new SelectList(listTests, "TestId", "TestTitle", 0); 
     return Json(selectListOfTests); 
    } 

    public List<Test> GetAllTests(int gradeLevelId) 
    { 
     var DB = db.Tests.Where(a => a.ArchiveDateTime == null && a.GradeLevelId == gradeLevelId); 
     List<Test> testModel = new List<Test>(); 
     foreach (var item in DB) 
     { 
      testModel.Add(new Test{ TestId = item.TestId, TestTitle = item.TestTitle}); 
     }    
     return testModel; 
    } 



    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Create([Bind(Include = "TestUrlId,TeacherId,TestDateId,School,TestId")] TestUrl testUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      testUrl.TestDateId = DateTime.Now.Ticks; 
      db.TestUrls.Add(testUrl); 
      await db.SaveChangesAsync(); 
      var newid = testUrl.TestDateId;    
      return RedirectToAction("GetTestUrl", new { id = newid }); 
     } 
     ViewBag.gradeLs = GetGradeLevels(); 
     return View(testUrl); 
    } 

我查看

@model OkChild.TestUrl 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 


@using (Html.BeginForm(null, null, FormMethod.Post, new { name = "CreateTestURL" })) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>TestUrl</h4> 
     <hr /> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.TeacherId, "Name/Email Address", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.TeacherId, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.TeacherId, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.School, "Your School", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.School, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.School, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="control-label col-md-2">Select your grade please</label> 
      <div class="col-md-10"> 
       @Html.DropDownList("GradeLevelId", (IEnumerable<SelectListItem>)ViewBag.gradeLs as SelectList, "Select a Grade", htmlAttributes: new { value = Request["GradeLevelId"], @class = "form-control", @onchange = "javascript:getTestList(this.value);" }) 
       @**@ 
      </div> 
     </div> 

     <div class="form-group" id="testIddiv"> 
      <label class="control-label col-md-2">Select your test please</label> 
      <div class="col-md-10"> 
       <select id="TestId" name="tests" class="form-control"></select> 
       @Html.ValidationMessageFor(model => model.TestId, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" id="SubmitID" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script type="text/javascript"> 
     $('#testIddiv').hide(); 
     $('#SubmitID').hide(); 

     function getTestList(gradeLevelId) { 
      var processmessage = "<option value='0'> Please Wait...</option>"; 
      $("#tests").html(processmessage).show(); 

      var url = '@Url.Action("GetTestsbyGradeLevelId")'; 
      $('#testIddiv').show(); 
      $.ajax({ 
       url: url, 
       data: { GradeLevelId: gradeLevelId }, 
       cache: true, 
       type: "POST", 
       success: function (data) { 
        var select = $("#TestId"); 
        select.empty(); 
        select.append($('<option/>', { value: "", text: "--Please Select--" })); 
        $.each(data, function (index, itemData) { 
         select.append($('<option/>', { 
          value: itemData.Value, 
          text: itemData.Text 
         })); 
        }); 

       }, 
       error: function (response) { 
        alert("error: " + response); 
       } 
      }); 
     }; 
     $('#TestId') 
      .change(function() { 
       if (this.Value === "--Please Select--") { 
        $('#SubmitID').hide(); 
       } 
       $('#SubmitID').show(); 
      }); 
    </script> 
} 

當我點擊提交GradeLevelId回到「Select a Grade」 ,我的TestId失去了它的選定值。我只需要保存TestId,等級級別id就是一個過濾器,可以查看測試ID。感謝您的幫助,非常感謝。

+0

我發現這篇文章涉及到的問題http://www.mikesdotnetting.com/article/265/asp-net-mvc-dropdownlists-multiple-selection-and-enum-support – jyrkim

回答

1

您可以手動從FormCollection中檢索這些發佈值。

請確保控件的名稱與要從FormCollection中檢索的值相同。

<select id="TestId" name="TestId" class="form-control"></select> 
          ^^^^ 

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Create(FormCollection formCollection) 
{ 
    if (ModelState.IsValid) 
    { 
     var teacherId = formCollection["TeacherId"]; 
     var school = formCollection["School"]; 
     var gradeLevelId = formCollection["GradeLevelId"]; 
     var testId = formCollection["TestId"]; 
             ^^^^ 
     ... 
    } 
    ViewBag.gradeLs = GetGradeLevels(); 
    return View(testUrl); 
} 
+0

謝謝我在解決問題後解決這個問題,而不是名字謝謝你。長時間啓動後的隧道視野..... – Camp