【问题标题】:Use RemoteAttribute with nested child collection将 RemoteAttribute 与嵌套子集合一起使用
【发布时间】:2012-07-18 18:09:33
【问题描述】:

我有两个视图模型,一个聚合另一个集合:

class Parent 
{
   public string Key { get; set; }
   public IList<Child> Children { get; set; }
}

class Child
{
   public string Key { get; set; }

   [Required, Remote("VerifyNameUnique", "Parent", AdditionalFields = "Key", ErrorMessage = "The name must be unique.")]
   public string Name { get; set; }
}

我有一个控制器动作

public ActionResult VerifyNameUnique(string key, string name)
{
    var result = // ... verify uniqueness
    return Json(result, JsonRequestBehavior.AllowGet);
}

还有一个观点:

@model Parent
@Html.HiddenFor(m => m.Key)
@for(var i=0; i<Model.Children; i++)
{
   @Html.HiddenFor (m => m.Children[i].Key)
   @Html.LabelFor(m => m.Children[i].Name)
   @Html.EditorFor (m => m.Children[i].Name)
}

当我的父/子编辑器模板调用操作来验证任何名称字段时,它会发送一个查询字符串?Children[0].Key=abc&amp;Children[0].Name=Fred,其中0 是刚刚编辑的子的索引i

由于前缀,它不会绑定到VerifyNameUnique 的参数。我尝试使用带有前缀集的BindAttribute,但前缀因i 的值而异。

编写自定义模型绑定器是一种选择,但现在对于这个简单的场景来说似乎有点过头了。有什么更好的我可以做的吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 validation data-annotations


    【解决方案1】:

    这根本不受支持。因此,您必须编写自定义模型绑定器或自定义远程验证属性。话虽如此,您要实现的目标可能不是一个好主意,因为如果用户单击提交按钮,将为集合中的每个字段发送 AJAX 请求,这不是很有效。我可能会直接在父级的集合属性上使用自定义远程验证字段,以便通过一次往返服务器来验证所有内容。

    【讨论】:

    • 谢谢。据我所知,AJAX 请求仅在用户更改字段而不是未更改字段时发出,因此在性能方面看起来不错。
    • 尝试直接点击提交按钮。无需更改任何内容。
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2017-01-24
    • 2013-10-11
    相关资源
    最近更新 更多