C# 为什么我无法在提交事件上获取DropDownList值
在我的MVC4项目中,我无法在编辑控制器上获取DropDownList数据。 我的UI语法如下: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
<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);
}
}