【问题标题】:Dropdownlist in viewModel create viewviewModel 中的下拉列表创建视图
【发布时间】:2015-07-01 08:25:12
【问题描述】:

我有一个“Leads”表,它与“Employees”表有一对多的关系。我还创建了一个leadViewModel 类,因为我需要一些线索的附加信息(比如地址和电话等)

这里是 Lead 类:

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

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

现在我想在“创建”视图中有一个下拉列表。我不知道该怎么办。这是我所做的并得到了错误。

LeadsController 创建获取:

    // GET: Leads/Create
    public ActionResult Create()
    {
        ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FirstName");

        return View();
    }

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>

我重复我的问题:当使用这样的 viewModel 时,我如何在视图中使用 dropdownliast,因为显然我所做的不是正确的方式并且不起作用。我收到错误:“对象引用未设置为对象的实例。”在创建视图中的 Html.DropdownlistFor(...) 上。

【问题讨论】:

  • 删除 ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FirstName"); 并用 leadVM.EmployeesSelectListItem 替换它(在 GET 和 POST 中),但在 GET 中你需要 LeadViewModel leadVM = new leadVM() 然后 `return View(leadVM);
  • 你能写出完整的代码行吗?对不起,我是菜鸟!

标签: asp.net-mvc entity-framework razor drop-down-menu


【解决方案1】:

您的视图基于 typeof LeadViewModel 但在 GET 方法中您不会将模型的实例传递给视图,更不用说填充 EmployeesSelectListItem 属性,所以在您的 DropDownListFor() 方法中,new SelectList(Model.EmployeesSelectListItem, ... 将throw 和异常(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");

当您返回视图时(即当ModelState 无效时)

然后在视图中使用

@Html.DropDownListFor(x => x._leads.EmployeeID, Model.EmployeesSelectListItem, new { @class = "form-control" })

【讨论】:

  • 谢谢,但现在我收到此错误:{"DataBinding: 'System.Web.Mvc.SelectListItem' 不包含名称为 'EmployeeID' 的属性。"} 有什么问题吗用我的 Html.DropdownListFor(...)?
  • 抱歉,忘记在视图中包含您需要的更改 - 请参阅更新
  • 我不知道该怎么感谢你。你是救世主!完美我的意思是完美的答案。在我的项目中,我会一直感谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2015-08-28
  • 2019-11-30
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多