C# 为什么我无法在提交事件上获取DropDownList值

C# 为什么我无法在提交事件上获取DropDownList值,c#,.net,asp.net-mvc,asp.net-mvc-4,C#,.net,Asp.net Mvc,Asp.net Mvc 4,在我的MVC4项目中,我无法在编辑控制器上获取DropDownList数据。 我的UI语法如下: <div class="form-group"> @Html.HiddenFor(model => model.School.SchoolID) @Html.LabelFor(model => model.School.SchoolName, new { @class = "control-label col-md-2" }) <div clas

在我的MVC4项目中,我无法在编辑控制器上获取DropDownList数据。 我的UI语法如下:

<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值

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ViewModel.ViewModelStudents student)
{    
    var tempResult = student.StudentCLass.ID;    
    //return RedirectToAction("Index");
//返回视图(学生); }

模型结构

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; }
}
公共部分类学生类
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公立学生班()
{
学生=新HashSet();
}
公共int ID{get;set;}
[长度(100)]
公共字符串类名{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection学生{get;set;}
}

MVC不会将下拉列表发回控制器,您必须在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");
}
如果您不想每次都从DB中读取下拉列表,您可以在函数中写入下拉列表代码,并将其保存到
会话[]

    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;

    }
注意:如果您在
会话中保存下拉列表
,则不必将其写入ViewBag,但您可以在View中直接访问它

并在控制器中调用此方法:

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

    PopulateDropDownList(); 

    return RedirectToAction("Index");
}
编辑

我不明白你是说你想选择下拉列表,但你正在将重定向到“Index”

如果您这样做:

return View(student);
而不是

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)

我想你想要这样的东西:

[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);
    }
}

框架将负责保存请求中的选定值。

显示您的模型类别Dawood Awan,感谢您提供有价值的信息,如果我在post事件中再次填写DropDownList,请告诉我如何在CONTROLLER中获取DropDownList选定项。感谢您回复我的编辑。您正在重定向到索引,因此在发布后将看不到编辑页面。如果您确实返回视图,它应该工作,请检查我的编辑。我需要在post部分获得DropDownList值,比如:tempResult,我需要在其他工作中使用此值,请告诉我如何在post控制器部分获得DropDownList选定值。ThanksIt应该发回选定值,如果它在HTML中。beginformi执行与语法相同的操作,谢谢,但问题出在编辑方法student中,我无法获取下拉列表信息。我无法获取所选值new SelectList()的重载包含4个参数(第四个是所选值)。但是,如果有多个选择列表具有相同的名称,则不起作用
[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);
    }
}