2012-04-17 1 views
0

У меня есть пользовательская модель связующий для десятичных знаков, которые содержат запятую, которая основана на этой статьи о Model Binding Decimal Valuesмодель связующий не привыкает для AJAX-запросы

Это работает отлично, за исключением, когда используются в Ajax запроса

Он отлично работает для запросов AJAX, которые не содержат сумму с запятой (т.е. значения меньше, чем тысяча)

ошибка

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

любая идея, что я мог бы пропустил благодаря

Аякса код:

$.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 Net Консоль:

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

+2

Используется модельное связующее - вы, вероятно, не правильно создаете свой запрос AJAX. Вы пытались использовать Fiddler или что-то в этом роде, чтобы увидеть фактический запрос? – Simon

+2

Можете ли вы разместить свой код AJAX? –

+0

Ive добавил код ajax выше – ChrisCa

ответ

1

Вашего Аякс призыв к действию, вероятно, не посылая суммы с правильными парами или строки запроса сформировать закодированное значение. Вы можете проверить запрос с помощью скрипача, чтобы узнать, что он отправляет.

+0

Да, забыл указать, что я отправлял json – ChrisCa

+0

на самом деле, он все еще не работает – ChrisCa

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

Тогда у вас есть способ действия взять модель, li ke so:

[HttpPost] 
public virtual JsonResult IsDepositRequired(MyModel model)