使用的ViewModels没有魔术字符串MVC下拉 [英] MVC Dropdown using ViewModels without Magic String

查看:86
本文介绍了使用的ViewModels没有魔术字符串MVC下拉的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从一个数据库下拉工作。我没有得到太远。我试图做到这一点使用视图模型,而不是使用魔法的字符串。我有一种感觉,我不是太遥远。可能有的请大家看看,看看我丢失或做错了什么?

我在这一行控制器得到一个编译错误:viewModel.Courts = CourtList,

我是pretty肯定是错误的,但我对如何做到这一点运行的想法。

领域模型:

 公共类父
{    公众诠释PARENTID {搞定;组; }    公共字符串名字{获得;组; }
    公共字符串名字{获得;组; }    公共虚拟苑苑{搞定;组; }
    //公开的IEnumerable< SelectListItem>法院{搞定;组; }
    公共虚拟的ICollection<儿童>蔡尔兹{搞定;组; }} 公共类苑
{
    公众诠释CourtId {搞定;组; }
    公共字符串CourtName {搞定;组; }    公共虚拟的ICollection<家长和GT;家长{搞定;组; }
}

查看产品型号:

 公共类ParentVM
{    公众诠释PARENTID {搞定;组; }    公共字符串名字{获得;组; }
    公共字符串名字{获得;组; }    //公众诠释CourtId {搞定;组; }
    //公共字符串CourtName {搞定;组; }    公共虚拟苑苑{搞定;组; }
    //公共虚拟IEnumerable的<球场及GT; CourtList {搞定;组; }
    公共IEnumerable的< SelectListItem>法院{搞定;组; }    公众的IList< ChildVM>儿童{搞定;组; }}

控制器:

  // GET:父母/创建
    公众的ActionResult的Create()
    {        IEnumerable的< SelectListItem> 。CourtList = db.Courts.ToList()选择(X =>新建SelectListItem
        {
            值= x.CourtId.ToString(),
            文= x.CourtName,        });        //ViewBag.CourtList =新的SelectList(db.CourtsCourtId,CourtName);        ParentVM视图模型=新ParentVM()
        {
            儿童=新的​​List< ChildVM>()
            {
                新ChildVM(){名称=,DOB =,地址=},
                //新ChildVM(){名称=2,DOB =2,地址=222},
                //新ChildVM(){名称=3,DOB =3,地址=3},
            },            viewModel.Courts = CourtList,
        };        返回视图(视图模型);    }    // POST:父母/创建
    //从overposting攻击保护,请启用要绑定到特定的属性,
    //更多详情请参阅http://go.microsoft.com/fwlink/?LinkId=317598。
    [HttpPost]
    [ValidateAntiForgeryToken]
    公众的ActionResult创建(ParentVM视图模型)
    {
        如果(ModelState.IsValid)
        {            VAR父=新的父()
            {
                名字= viewModel.FirstName,
                姓氏= viewModel.LastName
            };            db.Parents.Add(父);            的foreach(在viewModel.Children ChildVM项)
            {                VAR孩子=新的儿童()
                {
                    名称= item.Name,
                    DOB = item.DOB,
                    地址= item.Address
                };                db.Childs.Add(小孩);
            }            //父父=新的父();
            // VAR员工= AutoMapper.Mapper.Map<家长,ParentVM>(父);            db.SaveChanges();
            返回RedirectToAction(「指数」);
        }        返回视图(视图模型);
    }

查看:

  @ Html.DropDownList(法院,(IEnumerable的< SelectListItem>)Model.Courts)


解决方案

您试图绑定你DROPDOWNLIST财产法院的IEnumerable< SelectListItem&GT ; 。 A <选择> 回发一个值类型(所选项目的值)不能被绑定到一个集合。你需要一个附加属性绑定到(或者你可以绑定到 Court.CourtId ,但对 CourtName 属性不会被回发的约束。

查看模型

 公共类ParentVM
{
  公众诠释PARENTID {搞定;组; }
  公共字符串名字{获得;组; }
  公共字符串名字{获得;组; }
  [需要]
  公众诠释? SelectedCourt {搞定;组; } //绑定的下拉菜单,此
  公众的SelectList CourtList {搞定;组; }
  公众的IList< ChildVM>儿童{搞定;组; }
}

控制器

 公众的ActionResult的Create()
{
  ParentVM模式=新ParentVM()
  {
    儿童=新的​​List< ChildVM>()......,
    CourtList =新的SelectList(db.CourtsCourtId,CourtName),
    SelectCourt = //如果你想选择一个特定的选项,在这里设置的值
  });
  返回查看(模型);
}[HttpPost]
[ValidateAntiForgeryToken]
公众的ActionResult创建(ParentVM模型)
{
  如果(ModelState.IsValid)
  {
    法院法院= db.Courts.Find(model.SelectedCourt)//获取基于`SelectedCourt`法院
    VAR父=新的父()
    {
      名字= model.FirstName,
      姓氏= model.LastName,
      法院=法庭
    };
    db.Parents.Add(父);
    的foreach(在viewModel.Children ChildVM项)
    {
      ....
      db.Childs.Add(小孩);
    }
    db.SaveChanges();
    返回RedirectToAction(「指数」);
  }
  model.CourtList =新的SelectList(db.CourtsCourtId,CourtName); //重新分配选择列表
  返回查看(模型);
}

查看

  @ Html.DropDownListFor(M = GT; m.SelectedCourt,Model.CourtList,请选择 - )

如果 SelectedCourt 的价值的一个选项的值相匹配,当页面渲染它会被选中,否则第(标签)选项将被选中。当你回来后, SelectedCourt 的值将所选选项的值

I am trying to get a drop-down from a database to work. I did not get too far. I am trying to do it using viewModel and not use Magic String. I have a feeling I am not too far off. Could some please take a look and see what I am missing or doing wrong?

I am getting a compiling error at this line in the controller: viewModel.Courts = CourtList,

I am pretty sure it is wrong but I am running of ideas on how to do this.

Domain Models:

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

View Model:

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

View:

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

解决方案

Your trying to bind you dropdownlist to property Courts which is IEnumerable<SelectListItem>. A <select> posts back a value type (the value of the selected item) which cannot be bound to a collection. You need an additional property to bind to (or you could bind to Court.CourtId, but the CourtName property of Court wont be bound on postback.

View model

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

View

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

If the value of SelectedCourt matches the value of one of the options, it will be selected when the page is rendered, otherwise the first (label) option will be selected. When you post back, the value of SelectedCourt will be the value of the selected option

这篇关于使用的ViewModels没有魔术字符串MVC下拉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆