Asp.net mvc viewModel创建视图中的下拉列表
我有一个“Leads”表,它与“Employees”表有一对多的关系。我还创建了leadViewModel类,因为我需要Lead的一些附加信息(如地址和电话等) 以下是Lead类:Asp.net mvc viewModel创建视图中的下拉列表,asp.net-mvc,entity-framework,razor,drop-down-menu,Asp.net Mvc,Entity Framework,Razor,Drop Down Menu,我有一个“Leads”表,它与“Employees”表有一对多的关系。我还创建了leadViewModel类,因为我需要Lead的一些附加信息(如地址和电话等) 以下是Lead类: public partial class Leads { [Key] public int LeadID { get; set; } public string FirstName { get; set; } public string LastName { get; set; }
public partial class Leads
{
[Key]
public int LeadID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string FullName { get { return FirstName + " " + LastName; } }
public int EmployeeID { get; set; }
public virtual Employees Employees { get; set; }
}
员工类别:
public partial class Employees
{
public Employees()
{
this.Leads = new HashSet<Leads>();
}
[Key]
public int EmployeeID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string FullName { get { return FirstName + " " + LastName; } }
public virtual ICollection<Leads> Leads { get; set; }
}
LeadsController创建帖子:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "_leads,_addresses,_phones,_emails,EmployeesSelectListItem")] LeadViewModel leadVM)
{
if (ModelState.IsValid)
{
using (TransactionScope leadScope = new TransactionScope())
{
db.Leads.Add(leadVM._leads);
db.SaveChanges();
leadScope.Complete();
return RedirectToAction("Index");
}
}
ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FirstName", leadVM._leads.EmployeeID);
return View(leadVM);
}
最后是创建视图:
@model CL_AHR_CRM.ViewModels.LeadViewModel
...
<div class="form-group">
@Html.LabelFor(model => model._leads.EmployeeID, "EmployeeID", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(x => x._leads.EmployeeID, new SelectList(Model.EmployeesSelectListItem, "EmployeeID", "FirstName"), htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model._leads.EmployeeID, "", new { @class = "text-danger" })
</div>
</div>
@model CL\u AHR\u CRM.ViewModels.leadwiewmodel
...
@LabelFor(model=>model.\u leads.EmployeeID,“EmployeeID”,htmlAttributes:new{@class=“controllabel col-md-2”})
@DropDownListFor(x=>x._leads.EmployeeID,new SelectList(Model.EmployeesSelectListItem,“EmployeeID”,“FirstName”),htmlAttributes:new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.\u leads.EmployeeID,“,new{@class=“text danger”})
我重复我的问题:当使用这样的viewModel时,如何在视图中使用DropDownlast,因为显然我所做的不是这样,也不起作用。我在create视图中的Html.DropdownlistFor(…)上得到错误:“对象引用未设置为对象的实例。”您的视图基于
leadwiewmodel
的类型,但在get方法中,您不将模型的实例传递给视图,更不用说填充EmployeesSelectListItem
属性,因此在DropDownListFor()
方法中,new SelectList(Model.EmployeesSelectListItem,
将抛出异常(Model
的值为null
将“视图模型”属性更改为
public SelectList EmployeesSelectListItem { get; set; } // perhaps rename to EmployeeList?
然后将您得到的方法更改为
public ActionResult Create()
{
LeadViewModel model = new LeadViewModel();
model.EmployeesSelectListItem = new SelectList(db.Employees, "EmployeeID", "FirstName");
return View(model);
}
同样,在POST方法中,您需要使用
leadVM.EmployeesSelectListItem = new SelectList(db.Employees, "EmployeeID", "FirstName");
返回视图时(即ModelState
无效时)
然后在视图中使用
@Html.DropDownListFor(x => x._leads.EmployeeID, Model.EmployeesSelectListItem, new { @class = "form-control" })
删除
ViewBag.EmployeeID=new SelectList(db.EmployeeID,“EmployeeID”,“FirstName”);
并将其替换为leadVM.Employees SelectList项(在GET和POST中),但在GET中需要leadVM=new leadVM()
然后返回视图(leadVM);请您编写完整的代码行好吗?对不起,我是新手!谢谢,但现在我遇到了以下错误:{“DataBinding:'System.Web.Mvc.SelectListItem'不包含名为'EmployeeID'的属性。}我的Html.DropdownListFor(…)是否有任何问题对不起,忘记了在视图中包含您需要的更改-请参阅更新我不知道如何感谢您。您是一位救世主!完美我的意思是完美的答案。我将在整个项目中感谢您。
leadVM.EmployeesSelectListItem = new SelectList(db.Employees, "EmployeeID", "FirstName");
@Html.DropDownListFor(x => x._leads.EmployeeID, Model.EmployeesSelectListItem, new { @class = "form-control" })