Asp.net- Mvc复杂模型绑定

时间:2014-10-19 10:41:21

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

我在c#中有两个poco课程,一个酒店和房价,这是一对多的关系 在酒店中在控制器中创建动作我有一个viewbag来填充下拉列表,如下所示

 ViewBag.Hotel_Rate = new SelectList(db.Hotel_Rate, "Id", "Rate");

我在我的视图中有代码填充下拉列表

 @Html.DropDownList("Hotel_Rate", null, new { @Name = "Hotel_Rate.Rate", @id = "Hotel_Rate.Rate" })

每件事都应该在这里,drowpdown列表从datebase填充并显示在我的视图中,但是当我将模型发布到控制器模型时验证但是酒店费率的id是零,所以我得到了EntityValidationErrors&#39 ; 我绑定有什么问题? 我不想使用任何客户模型绑定类,asp.net中的默认模型绑定器能够处理,但如何处理?

public partial class Hotel
        {
            public Hotel()
            {

            }

            public int Id { get; set; }
            public string Name { get; set; }
            public virtual Hotel_Rate Rate { get; set; }

        }


       public partial class Hotel_Rate
        {
            public Hotel_Rate()
            {
                this.Hotel = new HashSet<Hotel>();
            }

            public int Id { get; set; }
            public string Rate { get; set; }
            public string Description { get; set; }

            public virtual ICollection<Hotel> Hotel { get; set; }
        }

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Name,Hotel_Rate")] Hotel hotel)
        {
            if (ModelState.IsValid)
            {
                db.Hotels.Add(hotel);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

生成的html如下

<select name="Hotel_Rate.Rate" id="Hotel_Rate.Rate">
<option value="1">5</option>
<option value="2">4</option>
</select>

1 个答案:

答案 0 :(得分:1)

您有2个问题,即控件的命名和[Bind(Include ..)]属性的使用,因为您没有名为Hotel_Rate的属性,其中包含属性Rate(这是什么<select name="Hotel_Rate.Rate" ..>正试图绑定到。)

使用强类型帮助程序确保不会发生命名问题

@Html.DropDownListFor(m => m.Rate.Rate, (SelectList)ViewBag.Hotel_Rate)

将呈现

<select name="Rate.Rate" id="Rate_Rate">
  <option value="1">5</option>
  <option value="2">4</option>
</select>

请注意,目前还不清楚您要绑定的内容。您的SelectList的值为ID,显示文字为Rate,因此我实际上认为您需要m => m.Rate.ID,否则您的约束1或{{1} }}当我认为您要将2Rate绑定到1属性

时,转到2属性

您的ID属性应为

Bind

但是由于您已在public ActionResult Create([Bind(Include = "Id,Name,Rate")] Hotel hotel) 列表中包含Hotel的所有属性,因此它毫无意义,可以完全删除。