0

モデル バインディング 10 進数値に関するこの記事に基づいたコンマを含む 10 進数用のカスタム モデル バインダーがあります。

これは ajax リクエストで使用された場合を除いて正常に動作します

コンマ付きの金額を含まない ajax リクエスト (つまり、1,000 未満の値) では問題なく機能します。

エラーは

System.ArgumentException: The parameters dictionary contains a null entry for parameter 'amount' 
 of non-nullable type 'System.Decimal' for method 
'System.Web.Mvc.JsonResult IsDepositRequired(System.String, System.String, System.String, 
  Boolean, System.Decimal, System.DateTime)' in 'Client.Controllers.DealingController'. An 
  optional parameter must be a reference type, a nullable type, or be declared as an 
  optional parameter.
  Parameter name: parameters
  at System.Web.Mvc.ActionDescriptor.
    ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary`2 parameters, MethodInfo methodInfo)

モデル バインダーが golbal.asax に正しく登録されている

私が逃した可能性のあるものをありがとう

ajax コード:

$.post('/Dealing/IsDepositRequired', {
                baseCurrency: deal.baseCurrency,
                termsCurrency: deal.termsCurrency,
                dealtCurrency: deal.dealtCurrency,
                isBuy: deal.direction == 'BUY',
                amount: deal.dealtCurrency == deal.baseCurrency ? deal.baseAmount : deal.termsAmount,
                valueDate: deal.valueDate
            }, function (show) {
                if (show) {
                    $('.Deposit').fadeIn(500);
                } else {
                    $('.Deposit').hide();
                }
            }, 'json');

コントローラ

[HttpPost]
public virtual JsonResult IsDepositRequired(string baseCurrency, string termsCurrency, string dealtCurrency, bool isBuy, decimal amount, DateTime valueDate)
{

Firebug ネット コンソール :

amount          100,000.00
baseCurrency    GBP
dealtCurrency   GBP
isBuy           true
termsCurrency   EUR
valueDate           30/10/2012

ソース:

baseCurrency=GBP&termsCurrency=EUR&dealtCurrency=GBP&isBuy=true&amount=100%2C000.00&valueDate=30%2F10%2F2012

4

2 に答える 2

1

アクションへのajax呼び出しは、正しいクエリ文字列パラメータまたはフォームでエンコードされた値で金額を送信していない可能性があります。fiddlerでリクエストをチェックして、何が送信されるかを確認できます。

于 2012-04-17T14:00:06.840 に答える
0

アクションメソッドに多くのパラメーターを持たせる代わりに、それらを既存のモデル/新しいモデルに配置し、ビューフィールドをフォームにラップしてから、フォームをリクエストにシリアル化するのが最善です。このようなもの?

これがフィールドを持つモデルであると仮定します。

public class MyModel
{
    public string BaseCurrency { get; set; }
    public string TermsCurrency { get; set; }
    public string DealtCurrency { get; set; }
    public bool IsBuy { get; set; }
    public decimal Amount { get; set; }
    public DateTime ValueDate { get; set; }
}

次に、次のようなビューがあると仮定します。

@model MyModel

//putting these fields in a form with an id of myForm
@Html.EditorFor(m => m.BaseCurrency)
//rest of your fields...

次に、データを指定するときの ajax 呼び出しで、データとして以下を送信するだけです。

$("#myForm").serialize()

次に、次のように、アクション メソッドにモデルを取得させます。

[HttpPost]
public virtual JsonResult IsDepositRequired(MyModel model)
于 2012-04-17T16:40:48.573 に答える