ASPNET MVC - 当该字段确实有值时,为什么ModelState.IsValid为"需要x字段"?

JK.*_*JK. 6 c# asp.net-mvc asp.net-mvc-2-validation

我有这样的模型:

public PurchaseOrder 
{
    [Required] [StringLength(15)]
    public virtual string OrderNumber {get;set;}
    // etc.        
}
Run Code Online (Sandbox Code Playgroud)

当我从视图中提交订单时(使用$ .post,而不是输入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 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ModelState.IsValid始终返回false,并返回错误:"订单号字段是必需的." 但是这个领域有一个价值(??为什么)

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

这是调试器的样子:

alt text http://www.freeimagehosting.net/uploads/f734f3d95d.png

编辑:额外信息....

我真的认为由于某种原因,模型绑定没有发生.当我尝试这里找到的代码:)

if (!ModelState.IsValid)
{
    ModelState.Clear();
    ModelMetadata modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => order, order.GetType());
    ModelValidator compositeValidator = ModelValidator.GetModelValidator(modelMetadata, base.ControllerContext);

    foreach (ModelValidationResult result in compositeValidator.Validate(null))
    {
        this.ModelState.AddModelError(result.MemberName, result.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

控制器方法实际上看起来像这样(我在最初写这个问题时错过了过滤器)

[JsonFilter(Param = "order", JsonDataType = typeof(PurchaseOrder))] 
public JsonResult Save(PurchaseOrder order) { //  etc ... }
Run Code Online (Sandbox Code Playgroud)

并且JsonFilter这样做是为了从json提交的数据中提取POCO:

filterContext.ActionParameters[Param] 
    = jsSerializer.Deserialize(inputContent, JsonDataType);
Run Code Online (Sandbox Code Playgroud)

我在这一行放了一个断点,顺序有效,加上order.OrderNumber有正确的值.

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

JK.*_*JK. 1

好吧,我已经“解决”了它,但我不太明白为什么我所做的改变有帮助。

我必须做三件事:

  1. 删除 json 过滤器(过滤器不绑定)

  2. 将 contentType 更改为 application/json

    $.ajaxSetup({ contentType: "application/json; charset=utf-8" });

  3. 使用 MVC futures 下载 Microsoft.Mvc.dll,如下所述:http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument。 .aspx . 哪里说要将其添加到 Global.asax.cs 中的 Application_Start() 中:

    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

现在我不知道为什么它有效,但它确实有效。

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

所以我问了 2 个以下问题:

  1. 是否可以在 $.post() 调用中设置内容类型?那么我就不需要全局设置它 Jquery - How to make $.post() use contentType=application/json?

  2. 如果 contenttype 是 application/json 是否可以使 jqrid 工作? Jquery - 如何使 $.post() 使用 contentType=application/json?