Moo*_*nCA 3 c# asp.net asp.net-mvc model-binding remote-validation
我使用了以下教程:http: //msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx
一切似乎都很好,但就我而言,字符串Username总是返回null.经过大量的研究,我发现每个人都发现了BIND前缀.在许多情况下,这将是伟大的,但不是这个.我应该注意所有属性和名称排列,但是在我的for循环中,EditorFor创建了一个[i] .Username字段,这不会映射到任何模型属性.
问题:我想我想将[i] .Username映射到Username,其中i是0-infinity中的任何数字,所以当它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>
}Run Code Online (Sandbox Code Playgroud)
因为如果不是成千上万的记录,我在技术上可以拥有HUNDREDS,我宁愿没有一个绑定PREFIX的所有1000.我从根本上错过了一些东西吗?我是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);
});
Run Code Online (Sandbox Code Playgroud)
小智 7
您尚未发布模型或控制器的代码,但假设您已RemoteAttribute应用于属性Username,例如
public class MyModel
{
[Remote("IsValidUserName", "Person")]
public string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
用一种方法 PersonController
public JsonResult IsValidUserName(string Username)
{
....
}
Run Code Online (Sandbox Code Playgroud)
和观点
@model List<Person>
...
@for (var i = 0; i < Model.Count; i++)
{
@Html.EditorFor(m => m[i].Username)
}
Run Code Online (Sandbox Code Playgroud)
这将生成html等
<input name="[0].UserName" ... />
<input name="[1].UserName" ... />
Run Code Online (Sandbox Code Playgroud)
不幸的是remote,jquery-validatepost中的方法返回了元素的名称和值,以便ajax调用看起来像
$.ajax({
url: '/Person/IsValidUserName',
data: { [0].UserName: 'someone@somewhere.com' },
...
Run Code Online (Sandbox Code Playgroud)
哪个不会绑定.
我已经在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
Run Code Online (Sandbox Code Playgroud)
这将剥离前缀,以便发布数据
data: { UserName: 'someone@somewhere.com' },
Run Code Online (Sandbox Code Playgroud)
并将正确绑定到该方法.
| 归档时间: |
|
| 查看次数: |
1938 次 |
| 最近记录: |