Asp.net MVC:附加字段不绑定远程验证
Asp.net MVC: Additional fields are not binding for 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 呈现列表元素。
任何帮助或建议都将非常有用。
提前致谢。
默认情况下,除主要 属性、
之外,所有模型属性均为空
如果您有其他属性来验证绑定,请包含它们。
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)
{
.....
}
如果远程方法接受一个包含其子项的对象(作为参数),它们应该被自动映射,例如:
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)
}
}
我从这个 post 中得到灵感,并通过修改 jquery-validate.js
文件中的 remote method
来修复它,如下所示:
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
我有模型列表,想执行远程验证。
型号:
[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 呈现列表元素。
任何帮助或建议都将非常有用。
提前致谢。
默认情况下,除主要 属性、
之外,所有模型属性均为空如果您有其他属性来验证绑定,请包含它们。
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)
{
.....
}
如果远程方法接受一个包含其子项的对象(作为参数),它们应该被自动映射,例如:
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)
}
}
我从这个 post 中得到灵感,并通过修改 jquery-validate.js
文件中的 remote method
来修复它,如下所示:
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