viewModel 中的下拉列表创建视图
Dropdownlist in viewModel create view
我有一个 "Leads" table,它与 "Employees" table 有一对多的关系。我还创建了一个 leadViewModel class 因为我需要一些关于潜在客户的额外信息(比如地址和电话等)
这是领导 class:
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; }
}
员工Class:
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; }
}
leadViewModel:
public class LeadViewModel
{
public Leads _leads { get; set; }
public Addresses _addresses { get; set; }
public Phones _phones { get; set; }
public Emails _emails { get; set; }
public IEnumerable<SelectListItem> EmployeesSelectListItem { get; set; }
}
现在我想在 "Create" 视图中有一个下拉列表。我不知道该怎么办。这是我所做的,但出现了错误。
LeadsController 创建获取:
// GET: Leads/Create
public ActionResult Create()
{
ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FirstName");
return View();
}
LeadsController 创建 Post:
[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>
我重复我的问题:当使用像这样的 viewModel 时,我如何在视图中使用 dropdownliast,因为显然我所做的不是正确的方式并且不起作用。我收到错误:"Object reference not set to an instance of an object." on the Html.DropdownlistFor(...) in create view.
您的视图基于 typeof LeadViewModel
但在 GET 方法中您没有将模型实例传递给视图,更不用说填充 EmployeesSelectListItem
属性 所以在您的 DropDownListFor()
方法 new SelectList(Model.EmployeesSelectListItem, ...
将抛出异常(Model
的值是 null
将视图模型 属性 更改为
public SelectList EmployeesSelectListItem { get; set; } // perhaps rename to EmployeeList?
然后将 GET 方法更改为
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");
当您 return 视图时(即当 ModelState
无效时)
然后在视图中使用
@Html.DropDownListFor(x => x._leads.EmployeeID, Model.EmployeesSelectListItem, new { @class = "form-control" })
我有一个 "Leads" table,它与 "Employees" table 有一对多的关系。我还创建了一个 leadViewModel class 因为我需要一些关于潜在客户的额外信息(比如地址和电话等)
这是领导 class:
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; }
}
员工Class:
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; }
}
leadViewModel:
public class LeadViewModel
{
public Leads _leads { get; set; }
public Addresses _addresses { get; set; }
public Phones _phones { get; set; }
public Emails _emails { get; set; }
public IEnumerable<SelectListItem> EmployeesSelectListItem { get; set; }
}
现在我想在 "Create" 视图中有一个下拉列表。我不知道该怎么办。这是我所做的,但出现了错误。
LeadsController 创建获取:
// GET: Leads/Create
public ActionResult Create()
{
ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FirstName");
return View();
}
LeadsController 创建 Post:
[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>
我重复我的问题:当使用像这样的 viewModel 时,我如何在视图中使用 dropdownliast,因为显然我所做的不是正确的方式并且不起作用。我收到错误:"Object reference not set to an instance of an object." on the Html.DropdownlistFor(...) in create view.
您的视图基于 typeof LeadViewModel
但在 GET 方法中您没有将模型实例传递给视图,更不用说填充 EmployeesSelectListItem
属性 所以在您的 DropDownListFor()
方法 new SelectList(Model.EmployeesSelectListItem, ...
将抛出异常(Model
的值是 null
将视图模型 属性 更改为
public SelectList EmployeesSelectListItem { get; set; } // perhaps rename to EmployeeList?
然后将 GET 方法更改为
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");
当您 return 视图时(即当 ModelState
无效时)
然后在视图中使用
@Html.DropDownListFor(x => x._leads.EmployeeID, Model.EmployeesSelectListItem, new { @class = "form-control" })