一尘不染

远程验证型号清单

c#

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

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

问题: 我想我想将[i]
.Username映射到Username,其中i是从0到无穷大的任何数字,因此当它GETS时,该值将正确传递给Action。我该怎么做呢?如果这是错误的,我该如何对表中的特定行进行验证?

@for (var i = 0; i < Model.Count; i++)

{

  BLAH BLAH BLAH CODE FOR BUILDING TABLE ROWS

  <td>

     @Html.EditorFor(modelItem => Model[i].Username)

  </td>

}

因为从技术上讲我可以拥有成百上千的记录(如果没有成千上万的记录),那么我宁愿没有针对所有1000的具有约束力的前缀。我在这里根本上缺少什么吗?我是ASP.NET
MVC的新手,并且习惯于WebForms,所以我感觉有时候我在混搭概念并混搭完全错误的东西。

编辑:
我通过执行以下修复,但不确定这是否是最好的主意。我将参数设置为等于不带[i]前缀的FieldName,但是仍然检索带[i]前缀的元素。Javascript不是我的强项,所以请让我知道它是否可怕。

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

阅读 175

收藏
2020-05-19

共1个答案

一尘不染

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

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

用一种方法 PersonController

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

和视图

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

这将生成诸如

<input name="[0].UserName" ... />
<input name="[1].UserName" ... />

不幸的是,中的remote方法jquery-validate回传了元素的名称和值,因此ajax调用看起来像

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

不会绑定。

我已经在Codeplex上将此问题报告为可能的解决方案。同时,您可以按以下remote方式修改jquery- validate.js文件中的方法

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' },

并将正确绑定到该方法。

2020-05-19