c# - 使用没有魔术字符串的 ViewModels 的 MVC 下拉列表

标签 c# asp.net-mvc entity-framework

我正在尝试从数据库中获取一个下拉列表来工作。我没有走得太远。我正在尝试使用 viewModel 而不是使用 Magic String 来做到这一点。我有一种感觉,我并不太远。有人可以看看我遗漏了什么或做错了什么吗?

我在 Controller 的这一行遇到编译错误:viewModel.Courts = CourtList,

我很确定这是错误的,但我正在思考如何做到这一点。

领域模型:

 public class Parent
{

    public int ParentID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual Court Court { get; set; }
    //public IEnumerable<SelectListItem> Courts { get; set; }
    public virtual ICollection<Child> Childs { get; set; }

}

 public class Court
{
    public int CourtId { get; set; }
    public string CourtName { get; set; }

    public virtual ICollection<Parent> Parents { get; set; }
}

查看模型:

public class ParentVM
{

    public int ParentID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    //public int CourtId { get; set; }
    //public string CourtName { get; set; }

    public virtual Court Court { get; set; }
    //public virtual IEnumerable<Court> CourtList { get; set; }
    public IEnumerable<SelectListItem> Courts { get; set; }

    public IList<ChildVM> Children { get; set; } 

}

Controller :

// GET: Parents/Create
    public ActionResult Create()
    {

        IEnumerable<SelectListItem> CourtList = db.Courts.ToList().Select(x => new SelectListItem
        {
            Value = x.CourtId.ToString(),
            Text = x.CourtName,

        });



        //ViewBag.CourtList = new SelectList(db.Courts, "CourtId", "CourtName");

        ParentVM viewModel = new ParentVM()
        {
            Children = new List<ChildVM>()
            {
                new ChildVM(){Name="", DOB="", Address=""},
                //new ChildVM(){Name="2", DOB="2", Address="222"},
                //new ChildVM(){Name="3", DOB="3", Address="3"},                    
            },

            viewModel.Courts = CourtList,
        };

        return View(viewModel);

    }

    // POST: Parents/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(ParentVM viewModel)
    {
        if (ModelState.IsValid)
        {

            var parent = new Parent()
            {
                FirstName = viewModel.FirstName,
                LastName = viewModel.LastName
            };

            db.Parents.Add(parent);

            foreach (ChildVM item in viewModel.Children)
            {

                var child = new Child()
                {
                    Name = item.Name,
                    DOB = item.DOB,
                    Address = item.Address
                };

                db.Childs.Add(child);
            }

            //Parent parent = new Parent();              
            //var employee = AutoMapper.Mapper.Map<Parent, ParentVM>(parent);                        

            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(viewModel);
    }

查看:

@Html.DropDownList("Courts", (IEnumerable<SelectListItem>)Model.Courts)

最佳答案

您试图将下拉列表绑定(bind)到属性 Courts这是 IEnumerable<SelectListItem> . <select>回发无法绑定(bind)到集合的值类型(所选项目的值)。您需要绑定(bind)一个额外的属性(或者您可以绑定(bind)到 Court.CourtId,但 CourtNameCourt 属性不会在回发时绑定(bind)。

查看模型

public class ParentVM
{
  public int ParentID { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  [Required]
  public int? SelectedCourt { get; set; } // bind the dropdown to this
  public SelectList CourtList { get; set; }
  public IList<ChildVM> Children { get; set; } 
}

Controller

public ActionResult Create()
{
  ParentVM model = new ParentVM()
  {
    Children = new List<ChildVM>() .....,
    CourtList = new SelectList(db.Courts, "CourtId", "CourtName"),
    SelectCourt = // set a value here if you want a specific option to be selected
  });
  return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ParentVM model)
{
  if (ModelState.IsValid)
  {
    Court court = db.Courts.Find(model.SelectedCourt) // get the Court based on `SelectedCourt`
    var parent = new Parent()
    {
      FirstName = model.FirstName,
      LastName = model.LastName,
      Court  = court
    };
    db.Parents.Add(parent);
    foreach (ChildVM item in viewModel.Children)
    {
      ....
      db.Childs.Add(child);
    }
    db.SaveChanges();
    return RedirectToAction("Index");
  }
  model.CourtList = new SelectList(db.Courts, "CourtId", "CourtName"); // reassign select list
  return View(model);
}

查看

@Html.DropDownListFor(m => m.SelectedCourt, Model.CourtList, "--Please select--")

如果值为SelectedCourt匹配其中一个选项的值,它会在页面呈现时被选中,否则第一个(标签)选项将被选中。当您回发时,SelectedCourt 的值将是所选选项的值

关于c# - 使用没有魔术字符串的 ViewModels 的 MVC 下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595715/

相关文章:

javascript - 使用 knockoutjs 操作 View 模型

c# - 在 Entity Framework 中将数据从一个提供者实时传输到另一个提供者

c# - 在 Visual Studio 2015 中安装 Entity Framework 失败

entity-framework - 首先使用实体​​框架数据库创建一对一关系

c# - 在 Visual Studio for Mac 中找不到路径的一部分

c# - 当对象经过特定旋转时播放声音

asp.net-mvc - ASP.NET MVC : Triggering an action before posting to Paypal payment gateway

c# - 已编译的 lambda 表达式用作属性 getter 和 setter : wrong benchmarking method or wrong lambda expression construction?

c# - EF6 生成查询垃圾 : Eliminate superfluous null checks

jquery - IE8 版本 8.0.7600 及更低版本中的 JSON 基元无效