9

我有一个这样的模型:

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 而不是提交?我能做些什么?

这是调试器的样子:

替代文字 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);
    }
}

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

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

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

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

filterContext.ActionParameters[Param] 
    = jsSerializer.Deserialize(inputContent, JsonDataType);

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

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

4

3 回答 3

1

您确定错误来自 OrderNumber 字段吗?

错误消息的订单号只有 2 个字,这似乎很奇怪。

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

于 2010-05-11T08:27:04.750 回答
1

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

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

$.post([url to method], 
       { order: { OrderNumber: orderNumber } }, 
       function(json) {
       //Insert code for actions to take after AJAX post returns.
       },
       'json');

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

于 2010-05-14T17:37:31.717 回答
1

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

我必须做三件事:

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

  2. 将 contentType 更改为 application/json

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

  3. 使用 MVC 期货下载 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 - 如何让 $.post() 使用 contentType=application/json?

  2. 如果内容类型是 application/json,是否可以使 jqrid 工作? Jquery - 如何让 $.post() 使用 contentType=application/json?

于 2010-05-16T21:22:20.237 回答