[英]Remote Validation for LIST of MODELs
我使用了以下教程: http : //msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx
一切似乎都很好,但就我而言,字符串用户名总是返回空值。 经过大量研究,我发现每个人都发现了 BIND 前缀。 这在许多情况下都很好,但不是这种情况。 我应该注意所有的属性和名称都对齐了,但是在我的 for 循环中,EditorFor 创建了一个 [i].Username 字段,这不会映射到任何模型属性。
问题:我想我想将 [i].Username 映射到 Username,其中 i 是 0-无穷大中的任意数字,因此当它获取时,该值将正确传递给 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);
});
您尚未发布模型或控制器的代码,但假设您已将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)
}
这将生成 html 如
<input name="[0].UserName" ... />
<input name="[1].UserName" ... />
不幸的是, jquery-validate
的remote
方法回发了元素的名称和值,因此 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' },
并将正确绑定到该方法。
假设代码格式如下:
看法:
@for(var i = 0; i<Model.Count; i++) {
<div class="row">
@Html.EditorFor(modelItem => Model[i].Username)
</div>
}
<style>
.valid{
background: lime;
}
</style>
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
模型:
public class MyModel {
[Remote("IsValidUserName", "Validation", HttpMethod = "POST")]
public string Username { get; set; }
}
可以使用自动模型绑定来绑定到远程验证。 如果为此使用列表或数组,则绑定将失败,而 Dictionary 可以捕获此错误。
但是请注意,字典中的 Key 将与视图中的 id 一致(例如 [5].Username 将映射到 {Key: 5, Value: MyModel{Username:...}})并且不会默认为 0,因此使用 Linq 查询。
控制器:
[HttpPost]
public JsonResult IsValidUserName(Dictionary<int,MyModel> Users) {
return Json(Users.First().Value.Username.Contains("User"));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.