MVC如何处理有效的空模型绑定

时间:2013-06-08 03:28:09

标签: asp.net-mvc

是否有任何普遍接受的方式来处理以下情况或我设计得不好?

我有一些域模型:

            public class Person
            {
                public int ID {get;set;}
                public string Name{get;set;}
                public int? AddressID {get;set;}
            }
            public class Address
            {
                public int ID{get;set;}
                public string Street {get;set;}
            }

然后我有一个View Model:

            public class Personnel
            {
                public Person Person{get;set;}
                public Address Address{get;set;}
            }

那么我对Personnel模型有一个强类型的视图,并说我有像这样的东西

            @Html.HiddenFor(m => m.Address.ID)
            @Html.EditorFor(m => m.Address.Street)

问题在于,当我获得Personnel模型时,有时Address可以为null,因为有时Person没有地址。但是UI要求仍然显示输入文本框。当Address为null时,视图中生成的标记如下:

            <input value name="Address.AddressID" type="hidden">

我有一个控制器

    [HttpPost]
    public ActionResult EditPersonnel(Personnel model)
    {
        if (ModelState.IsValid)
        {
            model.Save() // or whatever
        }

        return View(model);

    }

因此,当我回发到我的控制器时,Address.ID的表单集合中的值有一个空字符串。 ModelState始终无效,因为绑定程序无法将空字符串转换为int。 但我不想让它绑定,因为实际上没有任何地址(假设用户没有输入任何信息)。如何让绑定器忽略地址字段?

2 个答案:

答案 0 :(得分:1)

实际上,如果视图需要model属性,Address属性永远不应该是null。如果Person.AddressIDnull,请将Address的“空”实例分配给Personnel.Address媒体资源:

// assuming you have a data object named "person"
if(!person.AddressID.HasValue) // or use person.AddressID == null
{
     model.Address = new Address(); // assuming your view model is called "model"
}

答案 1 :(得分:0)

        [HttpPost]
        public ActionResult EditPersonnel(Personnel model)
        {
            if(model.Address.Equals(null))
              model.Address = new Address();
            if (ModelState.IsValid)
            {
                model.Save() // or whatever
            }

            return View(model);

        }