1

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

我有一些域模型,例如:

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

然后我有一个这样的视图模型:

            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 可能为空,因为有时 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。但我不希望它绑定,因为真的没有任何地址(假设用户没有输入任何信息)。你如何让活页夹忽略地址字段?

4

2 回答 2

1

实际上,如果视图需要模型属性,则该Address属性永远不应该。null如果Person.AddressIDis null,则将 an 的“空”实例分配给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"
}
于 2013-06-08T03:39:23.780 回答
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);

        }
于 2013-06-08T03:39:18.907 回答