2010-05-08 69 views
6

我有這樣一個模型:ASPNET MVC - 爲什麼ModelState.IsValid爲false「該字段是必需的」當該字段確實有值時?

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

當我從視圖提交訂單(使用.post的$,而不是輸入類型=提交),它進入我的控制器類:

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://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); 
    } 
} 

Then 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.OrderNumber具有正確的值。

所以仍然沒有得到解決,但希望這額外的信息將與尋找解決

+2

爲什麼房產標記爲虛擬?你在使用POCO變更追蹤嗎? – 2010-05-08 02:43:17

+0

什麼是價值?你如何使用'$ .post'?它與正常提交一起工作嗎? – 2010-05-08 14:08:35

+0

我不知道爲什麼它是虛擬的,這是當我開始在現有的應用程序工作。 – 2010-05-11 03:29:46

回答

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窗體-urlencoded

所以我問2後續的問題:

  1. 是否有可能設置在.post的$內容類型()調用?然後我不需要全局設置 Jquery - How to make $.post() use contentType=application/json?

  2. 如果contenttype是application/json,可以讓jqrid工作嗎? Jquery - How to make $.post() use contentType=application/json?

+0

看起來我需要將調用控制器方法的$ .post()更改爲$ .ajax()。但它只是覺得我做錯了什麼,如果contentType是application/x-www-form-urlencoded的默認值,它應該可以工作。 – 2010-05-16 21:54:54

+0

JK,你的兩個問題鏈接指向同一個問題。 – 2013-02-01 05:31:29

1

你確定錯誤是從訂單號碼字段來幫忙嗎?

這似乎很奇怪,錯誤消息有兩個單詞中的訂單號。

嘗試更改字段的名稱或刪除所需的標記以確保這是錯誤來自的地方。

+1

我相信MVC框架會自動爲您處理。它與您去Html.LabelFor(model.OrderNumber)時相同。標籤上標有「訂單號」字樣。 – 2010-05-14 01:36:17

+0

如果我刪除[Required]註釋,則ModelState.IsValid == true。它也是這個註釋的唯一字段。 – 2010-05-14 01:37:17

1

有可能你的jQuery文章沒有以正確的方式發回控制器。您可能只發布訂單號碼,而不是準確表示模型的對象。我不得不看你的JavaScript是絕對肯定的。

正確的方法發佈到該方法將(假設您的訂單號碼存儲在名爲「訂單號碼」 javascript變量:

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

如果是這種情況,那麼下一步我會採取的措施是仔細檢查javascript是否確實捕獲您的訂單號碼的價值並將其作爲請求的一部分發布。通過Firebug的快速檢查應該能夠告訴你這是否發生。

相關問題