模型列表的远程validation

我使用了以下教程: http : //msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx

一切似乎都很好,但在我的情况下,字符串Username总是返回null。 经过大量的研究,我发现每个人都发现了BIND前缀。 在许多情况下这会很棒,但不是这个。 我应该注意所有的属性和名称排列,但是在我的for循环中,EditorFor创建了一个[i] .Username字段,这不会映射到任何模型属性。

问题:我想我想将[i] .Username映射到用户名,其中i是0-infinity中的任何数字,所以当它GETS时,该值会正确地传递给Action。 我该怎么做呢? 如果这是错误的,我该怎么做才能对表中的特定行进行validation?

@for (var i = 0; i < Model.Count; i++) { BLAH BLAH BLAH CODE FOR BUILDING TABLE ROWS  @Html.EditorFor(modelItem => Model[i].Username)  } 

因为如果不是成千上万的记录,我在技术上可以拥有数百个,我宁愿没有一个全部1000的绑定PREFIX。我从根本上错过了一些东西吗? 我是ASP.NET MVC的新手,习惯了WebForms,所以我觉得有时候我会混合概念并混合一些完全错误的东西。

编辑:我通过执行以下操作修复它,但不确定这是否是最好的主意。 我将参数设置为没有[i]前缀的FieldName,但仍然检索带有[i]前缀的元素。 Javascript不是我的Forte所以如果它太可怕请告诉我。

 adapters.add("remote", ["url", "type", "additionalfields"], function (options) { var value = { url: options.params.url, type: options.params.type || "GET", data: {} }, prefix = getModelPrefix(options.element.name); $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { var paramName = fieldName.substr(fieldName.lastIndexOf(".") + 1); var actualFieldName = appendModelPrefix(fieldName, prefix) value.data[paramName] = function () { return $(options.form).find(":input").filter("[name='" + escapeAttributeValue(actualFieldName) + "']").val(); }; }); setValidationValues(options, "remote", value); }); 

您尚未发布模型或控制器的代码,但假设您已将RemoteAttribute应用于属性Username

 public class MyModel { [Remote("IsValidUserName", "Person")] public string Username { get; set; } } 

使用PersonController的方法

 public JsonResult IsValidUserName(string Username) { .... } 

和观点

 @model List ... @for (var i = 0; i < Model.Count; i++) { @Html.EditorFor(m => m[i].Username) } 

这将生成html等

   

不幸的是, jquery-validateremote方法会回发元素的名称和值,以便ajax调用看起来像

 $.ajax({ url: '/Person/IsValidUserName', data: { [0].UserName: 'someone@somewhere.com' }, ... 

哪个不会绑定。

我在Codeplex报告了这个问题,并提出了一个可能的解决方案。 在此期间,您可以在jquery-validate.js文件中修改remote方法,如下所示

 remote: function(value, element, param) { .... var data = {}; // data[element.name] = value; data[element.name.substr(element.name.lastIndexOf(".") + 1)] = value; // add this 

这将剥离前缀,以便发布数据

  data: { UserName: 'someone@somewhere.com' }, 

并将正确绑定到该方法。