复选框未呈现时,复选框上的模型验证失败

时间:2015-03-16 21:14:18

标签: c# asp.net-mvc asp.net-mvc-5 .net-4.5

当我的索引视图显示2个人并且未选择任何人时,由于.NET 4.5中的MinLengthAttribute,模型验证正常工作。

现在我的自定义逻辑出现在ui中。当索引视图中只显示一个人时,我不需要复选框来检查它。客户可以直接按提交按钮。我尝试手动填充SelectedIds数组,参见@else子句。

但是这段代码:Model.SelectedIds = new int[]{ item.PersonId};

不起作用,服务器端操作的viewmodel.SelectedIds属性始终为{int[0]}

如何仍然将一个人ID分配给SelectedIds数组?

查看

   @model ListTest.Models.PeopleListViewModel


@{
    var hasMoreThanOnePerson = @Model.People.Count > 1;   
}

@Html.BeginForm("Save", "Home")
{

@Html.ValidationSummary(false)

<table>
    @foreach (var item in Model.People)
    {
        <tr>
            @if (hasMoreThanOnePerson)
            {
                <td>
                    <input type="checkbox" name="SelectedIds" value="@item.PersonId" />
                </td>
            }
            else
            {
                Model.SelectedIds = new int[]{ item.PersonId};
            }

            <td>
                <input type="text" value="@item.Name" />
            </td>
        </tr>
    }
</table>
<input type="submit" value="Save" />
}

视图模型

public class PeopleListViewModel
    {
        public PeopleListViewModel()
        {
            SelectedIds = new int[] { };
        }

        [MinLength(1, ErrorMessage = "Minimum one person must be selected!")]
        public int[] SelectedIds { get; set; }

        public List<Person> People { get; set; }
    }

CONTROLLER

public ActionResult Index()
{ 
    var people = new List<Person> {
        new Person { Name = "Horst", PersonId = 10 }, 
        new Person { Name = "Michael", PersonId = 20} 
    };

    return View(new PeopleListViewModel { People = people });
}

[HttpPost]
public ActionResult Save(PeopleListViewModel viewModel)
{

    if (ModelState.IsValid)
    { 

    }

    viewModel.People = new List<Person> { new Person { Name = "Horst", PersonId = 10 }, new Person { Name = "bernarnd", PersonId = 20 } };

    return View("Index", viewModel);
}

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以考虑渲染隐藏字段,以确保将此值发送回您的服务器:

@if (hasMoreThanOnePerson)
{
    <td>
        <input type="checkbox" name="SelectedIds" value="@item.PersonId" />
    </td>
}
else
{
    @Html.Hidden("SelectedIds", item.PersonId)
}

但显然更好的方法是在服务器上处理这个 - 这意味着如果视图模型中没有分配值,您只需从后端获取它,因为用户没有机会修改它UI中的值,因为他没有可以操作的相应输入元素。