MVC3远程验证列表中的字段

Ste*_*ven 2 list asp.net-mvc-3 remote-validation

出于某种原因,每当我尝试远程验证模型中数组内的基本属性时,属性的值不会作为参数传递.

例如,当调用我的远程验证方法(UniqueItemNo)时,字符串参数"id"始终为null.如果我要在CartNumber而不是ItemNumber上执行验证,则正确传递参数.

调节器

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

楷模

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; }
}
Run Code Online (Sandbox Code Playgroud)

视图

@{
    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>
}
Run Code Online (Sandbox Code Playgroud)

小智 6

刚刚解决了同样的问题.所以对于我将来会遇到这个问题的那类人来说,这就是解决方案

这是根本原因.

当你这样做@Html.TextBoxFor(x=>x.m.Items[i].ItemNumber) 时输出这样的东西

<input type=text value='value' name='items[index].ItemNumber' ...
Run Code Online (Sandbox Code Playgroud)

然后它添加其他验证,如data-*属性进行验证.例如远程验证url data-remot-url等

现在,当表单得到验证时,它会向key = xxx [1] .propertyname等数据请求远程URL

并且这不能分配给将接收此属性的远程操作方法中的单个变量.

如果你将动作参数更改为这样的东西,那么它将起作用

 public JsonResult UniqueItemNo(list<string> propertyname)
Run Code Online (Sandbox Code Playgroud)

即使这样你就不需要保证,因为它需要让参数索引从0开始并且没有任何间隙.所以xxx [1] .ItemNumber永远不会被maped.

唯一剩下的解决方案是从查询字符串中获取属性名称并将其映射到所需的变量.像这样

    if(Request.QueryString.AllKeys.FirstOrDefault(p => p.ToLower().Contains("propertyname"))!=null)
    {
                     propertyname = Request.QueryString[Request.QueryString.AllKeys.First(p => p.ToLower().Contains("propertyname"))];
}
Run Code Online (Sandbox Code Playgroud)

它将搜索并映射所需的变量.

希望这会有所帮助