如何将值传递给MVC4中编辑模式下的字段?
嗨我在视图中有三个字段。这三个字段都是下拉列表。 我想在单击编辑按钮时将值传递给这些字段。 这是需要传递给下拉字段的值。 我的观点如下
在我看来,我有很多下降,但一旦我知道如何将值传递给一个下拉意味着我会做另一个下降。
对于Edit我在sql中创建一个视图并将该视图作为EDMX文件连接到我的应用程序中。在此视图(表格)中,我有所有字段都在访问者表单中。 该视图名称是View_VisitorsForm。
我的模型(VisitorsViewModel)
public Nullable Date { get; set; } public System.Guid VisitingID { get; set; } public Nullable EmployeeID { get; set; } public string EmployeeName { get; set; } public string Description { get; set; }
我的编辑代码
public ActionResult Edit(Guid ?id) { WafeERPNEWEntities db = new WafeERPNEWEntities(); SelectList typelist = new SelectList(db.Employees.ToList(), "EmployeeID", "DisplayName", db.Employees); ViewData["EmployeeName"] = typelist; if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } VisitorsViewModel ObjVisitorsviewModel = new VisitorsViewModel(); View_VisitorsForm visit = db.View_VisitorsForm.Find(id); visit.VisitingID = ObjVisitorsviewModel.VisitingID; visit.VisitingDate = ObjVisitorsviewModel.Date; visit.Description = ObjVisitorsviewModel.Description; if (ObjVisitorsviewModel == null) { return HttpNotFound(); } return View(ObjVisitorsviewModel); }
我的观点代码
@Html.LabelFor(model => model.Date) @Html.EditorFor(model => model.Date) @Html.ValidationMessageFor(model => model.Date) @Html.LabelFor(model => model.VisitingID) @Html.EditorFor(model => model.VisitingID) @Html.ValidationMessageFor(model => model.VisitingID) @Html.LabelFor(model => model.EmployeeName) @Html.DropDownList("EmployeeID", (IEnumerable)ViewData["EmployeeName"]) @Html.ValidationMessageFor(model => model.EmployeeName)
现在,当我单击编辑按钮时,它将值传递给此行
View_VisitorsForm visit = db.View_VisitorsForm.Find(id);
它也得到了visit.visitingID。 但它没有获取viewmodel中的值。所以该值在视图中为空。所有值都为空VisitingID,描述,日期字段为空,在Employee下拉列表中它不会显示我传递给该字段的值显示下拉列表中的第一个值。 所以请任何人告诉我如何解决这个问题。 实际上我试着按照我的最佳水平解释我的问题,如果你不理解我的问题,或者任何人需要我的完整代码或需要更多代码告诉我。 我准备再次更新我的代码。 但我需要解决方案。
提前谢谢..
使用:
@Html.DropDownListFor(model => model.EmployeeID,(IEnumerable)ViewData["EmployeeName"])
重要的部分是“DropDownListFor”。 您正在使用“DropDownList”。
使用DropDownListFor
帮助方法。
@Html.DropDownListFor(model => model.EmployeeID, (IEnumerable)ViewData["EmployeeName"])
现在,在您的GET操作中,您需要设置视图模型的EmployeeID
属性值。
public ActionResult Edit(int id) { var objVisitorsviewModel = new VisitorsViewModel(); // I am hard coding to 25. // You may replace it with a valid Employee Id from your db table for the record ObjVisitorsviewModel.EmployeeID= 25; return View(objVisitorsviewModel); }
更干净的解决方案是不使用ViewData传输渲染下拉选项所需的数据。 只需在视图模型中添加新属性,即可使代码更强类型化
public class VisitorsViewModel { public List Employees { set;get;} public Guid? EmployeeID { get; set; } // Your existing properties goes here }
现在在你的GET操作(创建/编辑)中,我们将加载到Emp enter code here
loyees属性而不是将数据存储在ViewData中。
public ActionResult Edit(int id) { var vm = new VisitorsViewModel(); vm.Employees = db.Employees.Select(s=> new SelectListItem { Value=s.EmployeId.ToString(), Text=s.DisplayName }).ToList(); return View(vm); }
在您看来,我们将使用DropDownListFor帮助方法和Employees属性
@model VisitorsViewModel @using(Html.BeginForm()) { @Html.DropDownListFor(s=>s.EmployeeID,Model.Employees,"Select") }
您正在使用DropDownList(...)
而不是DropDownListFor(...)
你的模特
您必须添加SelectList:
public SelectList Employees { get; set }
你的编辑
您必须获取您的员工列表并将其添加到您的模型中:
// Get employees list from the database var employees = db.Employee.Select(x => x.Id, x.Name).Tolist(); // Put the employees in a SelectList var selectList = new SelectList(employees .Select(x => new { value = x.Id, text = x.Name }), "value", "text");}).ToList(); // Pass the list to your ViewModel ObjVisitorsviewModel.Employees = selectList;
你的观点
最后,为此更改DropDownListFor行:
@Html.DropDownListFor(model => model.EmployeeID, model.Employees)
通过使用DropDownList(...)
,您的对象数据不会绑定到DropDown。 您必须手动管理其选定值。