2015-04-17 62 views
0

在我的MVC4项目中,我无法在编辑控制器上获取我的DropDownList数据。 我的UI语法是波纹管:为什么我在提交事件时未能获得DropDownList值

<div class="form-group"> 
    @Html.HiddenFor(model => model.School.SchoolID) 
    @Html.LabelFor(model => model.School.SchoolName, new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(model => model.School.SchoolName) 
     @Html.ValidationMessageFor(model => model.School.SchoolName) 
    </div> 
</div>  

<div class="form-group"> 
    @Html.HiddenFor(model => model.StudentCLass.ID) 
    @Html.LabelFor(model => model.StudentCLass.ClassName, new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.DropDownListFor(model => model.StudentCLass.ID, @ViewBag.StudentCLassList as SelectList,"Select Class") 
     @Html.ValidationMessageFor(model => model.StudentCLass.ID) 
    </div> 
</div> 


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

为了填补DropDownList的我用波纹管语法:点击提交按钮

public ActionResult Edit(int Id) 
{ 
    using (DB = new StudentContext()) 
    { 
     var result = DB.Students.FirstOrDefault(c => c.ID == Id);     
     ViewBag.StudentCLassList = new SelectList(DB.StudentClasses 
       .Select(sc => new ViewModelClass 
       { 
        ID = sc.ID, 
        ClassName = sc.ClassName 
       }).ToList(), "ID", "ClassName"); 

     return View(StudentInfo(result)); 
    } 
} 

之后,我不能让我的控制器操作的DropDownList值。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(ViewModel.ViewModelStudents student) 
{  
    var tempResult = student.StudentCLass.ID;  
    //return RedirectToAction("Index"); 

// return查看(学生); }

模型结构

public partial class StudentClass 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public StudentClass() 
    { 
     Students = new HashSet<Student>(); 
    } 

    public int ID { get; set; } 

    [StringLength(100)] 
    public string ClassName { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Student> Students { get; set; } 
} 
+0

显示您的模型类 –

回答

2

MVC Doen't发布下拉列表回Controller,您必须在POST方法再次填充下拉列表:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(ViewModel.ViewModelStudents student) 
{  
    var tempResult = student.StudentCLass.ID; 

ViewBag.StudentCLassList = new SelectList(DB.StudentClasses 
       .Select(sc => new ViewModelClass 
       { 
        ID = sc.ID, 
        ClassName = sc.ClassName 
       }).ToList(), "ID", "ClassName"); 

    return RedirectToAction("Index"); 
} 

你可以写下拉列表中的代码在一个函数中,如果您不想从数据库中读取此下拉列表,则可以将其保存到Session[]

public void PopulateDropDownList(){ 

var items = Session["MyDropDown"] != null ? (SelectList)Session["MyDropDown"] : null; 
if(items ! null) {ViewBag.StudentCLassList; return;} 

     items = new SelectList(DB.StudentClasses 
         .Select(sc => new ViewModelClass 
         { 
          ID = sc.ID, 
          ClassName = sc.ClassName 
         }).ToList(), "ID", "ClassName"); 

Session["MyDropDown"] = ViewBag.StudentCLassList = items; 

    } 

注意:如果您将DropDown列表保存在Session中,则您没有将其写入ViewBag,但可以直接在View中访问它。

并调用控制器这个方法:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(ViewModel.ViewModelStudents student) 
{  
    var tempResult = student.StudentCLass.ID; 

    PopulateDropDownList(); 

    return RedirectToAction("Index"); 
} 

编辑

我不明白你说你要选择的下拉,但你Redirecting为'指数”。

如果你这样做:

return View(student); 

而不是

return RedirectToAction("Index"); 

return RedirectToAction("Index");将您重定向到索引页面,刷新网页。

编辑2:

我只注意到你有

@Html.HiddenFor(model => model.StudentCLass.ID) 

MVC被张贴价值从这个隐藏回到控制器。尝试删除此,

的事情是,你有两个控件使用相同的id

@Html.DropDownListFor(model => model.StudentCLass.ID 

AND 

@Html.HiddenFor(model => model.StudentCLass.ID) 
+0

Dawood Awan,感谢您的宝贵信息回复,请告诉我如何在控制器中获得DropDownList选定项目,如果我在后期事件中再次填充DropDownList。感谢您的回复 – shamim

+0

请参阅我的编辑。你正在重定向到索引,所以你不会在Post之后看到编辑页面。如果你确实返回查看它应该工作 –

+0

对不起,请检查我的编辑。我需要在后部分得到DropDownList的值,如:tempResult,我需要使用这个值的一些其他工作,你会告诉我如何得到DropDownList在POST控制器部分选定的值。谢谢 – shamim

0

我想你想是这样的:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(ViewModel.ViewModelStudents student) 
{ 
    if (ModelState.IsValid) 
    { 
     // save changes and redirect 

     return RedirectToAction("Index"); 
    } 
    else 
    { 
     using (DB = new StudentContext()) 
     { 
      ViewBag.StudentCLassList = new SelectList(DB.StudentClasses.ToList(), "ID", "ClassName");   
     } 

     return View(student); 
    } 
} 

框架会照顾 - 保留选择的请求中的值。

+0

我做同样的事情作为您的语法,谢谢但问题是在编辑方法学生我不能我的dropDownList信息。我无法获得选定的值 – shamim

+0

新的SelectList()有4个参数(第四个参数是选定值)的重载。但如果有多个具有相同名称的选择列表,它将不起作用 – Francisco

相关问题