【问题标题】:Model Validation on collection with checkbox fails when checkbox not rendered未呈现复选框时,使用复选框对集合进行模型验证失败
【发布时间】:2015-04-12 04:04:58
【问题描述】:

当我的索引视图显示 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; }
    }

控制器

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

【问题讨论】:

  • Model.SelectedIds = new int[]{ item.PersonId}; 只是在发送到客户端之前在服务器上设置值。当只有一个人时,您永远不会为 SelectedIds 属性呈现任何输入,因此不会回发任何内容,因此 SelectedIds 在回发时是一个空数组并且验证失败。
  • 希望thisthis的回答对你有帮助

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


【解决方案1】:

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

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

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

【讨论】:

  • 啊……我离得很近。我也想过 HiddenFor 并没有看到解决方案...感谢 Darin 成功了!
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多