C# ASPNET MVC-为什么ModelState.IsValid为false;“x”字段是必填的;该字段何时有值?

C# ASPNET MVC-为什么ModelState.IsValid为false;“x”字段是必填的;该字段何时有值?,c#,asp.net-mvc,asp.net-mvc-2-validation,C#,Asp.net Mvc,Asp.net Mvc 2 Validation,我有一个这样的模型: public PurchaseOrder { [Required] [StringLength(15)] public virtual string OrderNumber {get;set;} // etc. } 当我从视图中提交订单时(使用$.post,而不是input type=submit),它将转到我的控制器类: public class PurchaseOrderController { public Json

我有一个这样的模型:

public PurchaseOrder 
{
    [Required] [StringLength(15)]
    public virtual string OrderNumber {get;set;}
    // etc.        
}
当我从视图中提交订单时(使用$.post,而不是input type=submit),它将转到我的控制器类:

public class PurchaseOrderController
{
    public JsonResult Save(PurchaseOrder order)
    {
        // TryUpdateModel(order); // commented out since modelstate.isvalid remains false anyway
        if (ModelState.IsValid)
        {
            // its never valid 
        }
    }
}
ModelState.IsValid始终返回false,错误为:“订单号字段是必需的。”但此字段中有一个值(??为什么)

当它确实有一个值时,为什么会说“值是必需的”?我错过什么了吗?是因为$post而不是提交吗?我能做什么

这是调试器的外观:

编辑:额外信息…

我真的认为由于某种原因,模型绑定没有发生。当我尝试在此处找到此代码时:)

然后ModelState.IsValid=true。compositeValidator.Validate()返回0个错误。我认为这表明模型没有绑定,但我仍然不知道为什么

控制器方法实际上是这样的(最初写这个问题时我漏掉了过滤器)

JsonFilter会这样做,从json提交的数据中提取POCO:

filterContext.ActionParameters[Param] 
    = jsSerializer.Deserialize(inputContent, JsonDataType);
我在这行上放置了一个断点,order是有效的,加上order.OrderNumber具有正确的值


所以仍然没有解决,但希望这些额外的信息有助于找到解决方案

您确定错误来自OrderNumber字段吗

奇怪的是,错误消息中有两个单词的订单号


尝试更改字段的名称或删除所需的标记,以确保这是错误的来源。

您的jQuery帖子可能没有以正确的方式发回控制器。您可能只是发布订单号,而不是准确表示模型的对象。我必须查看您的javascript才能绝对确定

发布到该方法的正确方法是(假设您的订单号存储在名为“orderNumber”的javascript变量中):

如果是这种情况,那么我将采取的下一步是再次检查javascript是否确实捕获了您订单号的值,并将其作为请求的一部分发布。通过Firebug进行快速检查应该能够告诉您是否发生了这种情况。

我已经“解决”了这是我的梦想,但我真的不明白为什么我所做的改变会有所帮助

我必须做三件事:

  • 删除json过滤器(过滤器不绑定)

  • 将contentType更改为application/json

    $.ajaxSetup({ contentType:“应用程序/json;字符集=utf-8” }))

  • 使用MVC futures下载Microsoft.MVC.dll,如下所述:。其中表示要将其添加到Global.asax.cs中的应用程序_Start():

    添加(新的JsonValueProviderFactory())

  • 现在我不知道这到底是为什么起作用,但它确实起了作用

    不幸的是,它有一个负面的副作用:contenttype应用于所有的$.get()和$.post()方法,并破坏了我的所有jqgrids-它们似乎只有在内容类型是application/x-www-form-urlencoded的默认值时才起作用

    所以我问了两个问题:

  • 是否可以在$.post()调用中设置内容类型?这样我就不需要全局设置它了

  • 如果contenttype是application/json,是否可以使jqrid工作?


  • 为什么该属性标记为虚拟?您是否使用POCO更改跟踪?值是多少?您如何使用
    $。post
    ?它是否与正常提交一起工作?我不知道为什么它是虚拟的,就像我开始使用现有应用程序时那样。是的,它与正常输入类型=提交按钮代码一起工作,用于手动验证模型的有效性und here:我相信MVC框架可以神奇地自动处理这些问题。这与使用Html.LabelFor(model.OrderNumber)时一样。标签上写着“OrderNumber”,单词之间有空格。如果我删除[Required]注释,然后是ModelState.IsValid==true。它也是此注释的唯一字段。看起来我需要将调用控制器方法的$.post()更改为$.ajax()。但感觉好像我做错了什么,如果contentType是application/x-www-form-urlencoded的默认值,它应该可以工作。
    [JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))] 
    public JsonResult Save(PurchaseOrder order) { //  etc ... }
    
    filterContext.ActionParameters[Param] 
        = jsSerializer.Deserialize(inputContent, JsonDataType);
    
    $.post([url to method], 
           { order: { OrderNumber: orderNumber } }, 
           function(json) {
           //Insert code for actions to take after AJAX post returns.
           },
           'json');