出于某种原因,每当我尝试远程验证模型中数组内的原始属性时,该属性的值都不会作为参数传递。
例如,当调用我的远程验证方法(UniqueItemNo)时,字符串参数“id”始终为空。如果我要对 CartNumber 而不是 ItemNumber 执行验证,则参数会正确传递。
Controller
public class HomeController : Controller
{
public ActionResult Index()
{
CartModel cart = new CartModel();
cart.Items.Add(new ItemModel() { ItemNumber = "12345" });
return View(cart);
}
[HttpPost]
public JsonResult UniqueItemNo(string id)
{
/** Do Work **/
return null;
}
}
模型
public class ItemModel
{
[Remote("UniqueItemNo", "Home", HttpMethod="POST")]
public string ItemNumber { get; set; }
}
public class CartModel
{
public CartModel()
{
Items = new List<ItemModel>();
}
public List<ItemModel> Items { get; set; }
public string CartNumber { get; set; }
}
查看
@{
ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
@using(Html.BeginForm()) {
<p>
@for(int i = 0; i < Model.Items.Count; i++)
{
@Html.TextBoxFor(m => m.Items[i].ItemNumber);
@Html.ValidationMessageFor(m => m.Items[i].ItemNumber);
}
</p>
}
最佳答案
刚刚解决了同样的问题。所以对于我这种将来会遇到这个问题的人来说,这里是解决方案
这是根本原因。
当你执行 @Html.TextBoxFor(x=>x.m.Items[i].ItemNumber)
它输出这样的东西
<input type=text value='value' name='items[index].ItemNumber' ...
然后它添加其他验证,如 data-* 属性以进行验证。例如远程验证 url data-remot-url 等
现在,当表单得到验证时,它会请求带有 key=xxx[1].propertyname 等数据的远程 url
并且这不能分配给将接收此属性的远程操作方法中的单个变量。
如果您将操作参数更改为类似这样的内容,那么它将起作用
public JsonResult UniqueItemNo(list<string> propertyname)
即使如此,您也无法得到保证,因为它要求参数索引从 0 开始并且没有任何间隙。所以 xxx[1].ItemNumber 永远不会被映射。
唯一剩下的解决方案是从查询字符串中获取属性名称并将其映射到您需要的变量。像这样
if(Request.QueryString.AllKeys.FirstOrDefault(p => p.ToLower().Contains("propertyname"))!=null)
{
propertyname = Request.QueryString[Request.QueryString.AllKeys.First(p => p.ToLower().Contains("propertyname"))];
}
它将搜索并映射所需的变量。
希望对你有帮助
关于asp.net-mvc-3 - 列表中字段的 MVC3 远程验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948944/