2009-08-17 56 views
10

我最近和MVC一起工作,我在嘗試使用ajax向我的控制器發送請求時遇到了一個奇怪的問題。我使用jQuery直接與MVC說出來(1.3.2版本),我試圖發出這樣Ajax請求:JQuery + Asp.Net MVC,傳遞浮點數

$.post("Home/OpenTrade", { price: 1.5 }, function() { }, "json"); 

我也試過parseFloat("1.5"),而不是1.5
當我嘗試使用

[AcceptVerbs(HttpVerbs.Post)] 
public void OpenTrade(float? price) 

我的接收價在控制器此值始終爲空。如果我省略了?控制器根本不被調用(這並不奇怪),我試過使用decimal以及double類型。此外,這個函數在我發送整型數據時起作用(如果我發送1這個控制器被調用,並且float? price被正確填充)。我錯過了什麼,或者它是一個錯誤?

Ad。我可以以字符串的形式獲得價格,然後手動解析它,但是我不喜歡這個解決方案,因爲它不夠優雅,而且它使用像MVC這樣的框架來完成這個任務。

編輯&答:使用喬爾的建議,我創建了一個模型綁定,我會後,也許有人會使用它:


class DoubleModelBinder : IModelBinder 
{ 
    #region IModelBinder Members 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     string numStr = bindingContext.ValueProvider[bindingContext.ModelName].AttemptedValue; 
     double res; 

     if (!double.TryParse(numStr, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out res)) 
     { 
      if (bindingContext.ModelType == typeof(double?)) 
       return null; 
      throw new ArgumentException(); 
     } 

     if (bindingContext.ModelType == typeof(double?)) 
      return new Nullable<double>(res); 
     else 
      return res; 
    } 

    #endregion 
} 

它可以被註冊爲雙和雙?活頁夾,雙重?如果值不能解決,它會將null傳遞給控制器​​。

Btw。任何想法,爲什麼浮動和雙打不工作(對我來說?)?

編輯2 &解決方案:好吧,這將是有趣的:)。它並沒有爲我工作,因爲請求的字符串發送1.5432(一個示例值),這是完全沒問題,但... MVC試圖解碼它內部使用我的文化設置,這是期待數字格式爲1 , 5432,所以轉換失敗了。
所以,要記住的事情:如果你生活在陌生的國家,請仔細檢查你的文化設置。

+1

我試圖夾住一個測試應用程序,看看我是否可以重新創建原始問題(cut'n'pasted你的jquery調用和動作簽名),但它對我來說都工作正常。 float參數始終具有該值。 ....奇怪吧 – 2009-08-17 02:47:23

+1

他們爲我工作。使用像Fiddler或HttpWatch這樣的HTTP工具來查看您的AJAX帖子是否正確組建。 – 2009-08-17 02:49:43

+0

這很奇怪......我會仔細研究一下,也許我會發現有什麼不對。 – 2009-08-17 03:01:46

回答

5

製作浮動模型活頁夾。這可以從表單集合中提取適當的值,解析它,並將其作爲參數返回。

0

編輯:你需要使用jQuery post嗎?有什麼方法可以使用內置的對Ajax的支持來創建一個鏈接,在這種情況下結果如何?例如

Ajax.ActionLink("Link Name", "OpenTrade", "Home", 
        new { price = 1.5f }, 
        new AjaxOptions 
        { 
         OnSuccess = "success", 
         .... 
        }) 

當指定浮點值時,通常必須用'f'後綴(例如,

float f = 1.5f; 

你試過嗎?

另一種解決辦法是改變你的服務的方法:

[AcceptVerbs(HttpVerbs.Post)] 
public void OpenTrade(int dollars, int cents) 
+0

Ad 1.請記住,我在JavaScript中有數字,而不是在C#代碼中,因此添加'f'將無濟於事。 廣告2.這是一個解決方案,但它比獲取字符串imho更不優雅(我忽略了一個事實,即我將money value作爲float number傳遞,這幾乎從來都不是一個好主意,但在這種情況下,我知道我在做什麼) – 2009-08-17 01:49:43

+0

廣告編輯。我寧願需要在JS中實現完整的邏輯,因爲我不只是少了一些鏈接與Ajax查詢,此外,我不認爲這個問題在於JS方面,它只是以給定的格式將數據傳遞給MVC。 – 2009-08-17 01:53:19

+0

廣告1.當然,愚蠢的我:) – 2009-08-17 02:05:16

0

你檢查,看看有什麼來自服務器的JSON響應?我注意到你有沒有封裝你用雙引號價格變量,所以您的文章到服務器的樣子:

{'price':1.5} 

我不知道這是否會是隻有一個數據參數的問題,但我懷疑你真正想要的樣子是什麼傳遞給ASP.Net方法

"{'price':1.5}" 

的jQuery AJAX方法應該有一個數據參數,否則jQuery的可能會錯誤地連載中數據的字符串。具有字符串意味着jQuery將離開您的JSON對象,並將整個字符串傳遞給ASP.NET以在服務器端解析。

+0

我不認爲這是這種情況,當我做了你的建議我,一切都停止工作:),如果我試圖通過其他數據,它們是字符串 - 它們沒有被mvc反序列化。 – 2009-08-17 02:35:44

2
{ price: '1,5' } 

應該沒問題。

+0

我遇到過很多類似的問題。在控制器中使用字符串並將其轉換回來是最簡單的,有時甚至是最優雅的方法。 – 2014-09-22 12:00:40

-2
UpdateImage(string rotationAngle) 
     { 
      double d; 
      double.TryParse(rotationAngle, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out d); 
+0

請格式化您的代碼。 – 2014-08-15 14:00:01