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

我有这样的模型:

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

当我从视图中提交订单时(使用$ .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 } } } 

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

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

这是调试器的样子:

alt text http://sofzh.miximages.com/c%23/www.freeimagehosting.net

编辑:额外信息….

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

 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错误。 我认为这表明模型没有约束,但我仍然不知道为什么。

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

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

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

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

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

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

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

奇怪的是,错误消息的订单号为2个字。

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

你的jQuerypost有可能没有以正确的方式发布回控制器。 您可能只发布订单号而不是准确表示模型的对象。 我必须看到你的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进行快速检查应该能够告诉您这是否正在发生。

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

我必须做三件事:

  1. 删除jsonfilter(filter不绑定)

  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());

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

不幸的是,它有一个负面的副作用:contenttype应用于所有$ .get()和$ .post()方法,并打破了我所有的jqgrids – 如果内容类型是application / x的默认值,它们似乎只能工作-www窗体-urlencoded

所以我问过2个问题:

  1. 是否可以在$ .post()调用中设置内容类型? 然后我不需要全局设置Jquery – 如何使$ .post()使用contentType = application / json?

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