Asp.net MVC:其他字段未绑定用于远程验证

时间:2019-01-11 17:11:49

标签: c# asp.net-mvc asp.net-mvc-4 model-binding remote-validation

我有模型列表,并且想要执行远程验证。

型号:

[System.Web.Mvc.Remote("Method", "Controller", HttpMethod = "POST", AdditionalFields = "prop2,prop3", ErrorMessage = "Error")]
 public string prop1 { get; set; }

MVC为每个元素生成的名称如下:

<input type='text' name='test[0].prop1' />

因此,值未绑定到参数。我从这个Post获得了帮助。现在,我获取了“ prop1”的值,但仍然没有绑定“ prop2”和“ prop3”。

编辑:我正在使用BeginCollectionItem渲染列表元素。

任何帮助或建议都会很棒。

谢谢。

3 个答案:

答案 0 :(得分:0)

默认情况下,除主要属性外,所有模型属性均为null

如果您还有其他要验证绑定的属性,请

public ActionResult CheckThings([Bind(Include = "prop2,prop3")] Model model)
{
.....
}

如果您的操作方法不接受模型,并且您将单独的字段传递给它,请使用

public ActionResult CheckThings([Bind(Prefix = "Prop1OrSomethigElse")]string prop1, [Bind(Prefix = "Prop2OrSomethigElse")]string prop2, [Bind(Prefix = "Prop3OrSomethigElse")]string prop3)
{
.....
}

答案 1 :(得分:0)

如果远程方法采用一个保存其子项的对象(作为参数),则应自动映射它们,例如:

public class Stuff
{
  public List<Item> Items { get; set; }
}

public class Item
{
  [Remote(action:"Validate", controller: "Account", 
      HttpMethod = "POST", 
      ErrorMessage = "Error",
      AdditionalFields = "Prop2,Prop3")]
  public string Prop1 { get; set; }

  public string Prop2 { get; set; }
  public string Prop3 { get; set; }
}
@using (Html.BeginForm("Index", "Account"))
{
  for (int i = 0; i < Model.Items.Count; i++)
  {
    @Html.TextBoxFor(m => Model.Items[i].Prop1)
    @Html.TextBoxFor(m => Model.Items[i].Prop2)
    @Html.TextBoxFor(m => Model.Items[i].Prop3)
  }
}

enter image description here

答案 2 :(得分:0)

我已经从此post中吸取了灵感,并通过如下修改remote method文件中的jquery-validate.js来解决了这个问题:

remote: function(value, element, param) {
 ....
  param = typeof param === "string" && {url:param} || param;
  ....

  for (var property in param.data) {
    if (param.data.hasOwnProperty(property)) {
        param.data[property.substr(property.lastIndexOf(".") + 1)] = param.data[property];
      }
    }
   //ajax call