asp.net-mvc-3 - 列表中字段的 MVC3 远程验证

标签 asp.net-mvc-3 list remote-validation

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

例如,当调用我的远程验证方法(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/

相关文章:

html - 如何用 <a> 标签替换 MVC3 Grid 列 ActionLink?

c# - FluentValidation 不支持我添加的 CSS 类

c# - 如何以最有效的方式返回 List<int> 中两个最大值的总和? C#

c# - 我如何获得 C# 中两个列表的差异?

asp.net-mvc - 如何在远程验证中使用多个 AdditionalFields - asp.net mvc

asp.net-mvc-3 - 超时在 ASP.Net MVC FormsAuthentication 中不起作用

asp.net-mvc-3 - Azure 和 HttpHandler

python - 为什么使用 fromkeys 初始化列表字典会影响列表追加方式

asp.net-mvc - 远程验证 OnBlur 和空字符串

asp.net-mvc-3 - 在MVC3非强制性远程验证上强制重新验证