JQuery + Asp.Net MVC, проходящий по плавающей запятой

Недавно я работаю с MVC, и я столкнулся с какой-то странной проблемой при попытке отправить запрос на контроллер с помощью ajax. Я использую JQuery (версия 1.3.2), который пришел непосредственно с MVC, я пытаюсь отправить такой запрос ajax:

$.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, чтобы сделать это для меня.

Отредактируйте и ответьте: используя совет Joel, я создал модель Binder, которую я опубликую, возможно, кто-то ее будет использовать:


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. Любые идеи, почему плавает и удваивается, не работают из коробки (для меня?)?

Edit2 и решение: Хорошо, это будет забавно:). Это не сработало для меня, потому что запрошенная строка отправляла 1.5432 (примерное значение), что совершенно нормально, но... MVC пыталась его внутренне декодировать, используя настройки моей культуры, которые ожидают, что числа будут в формат 1 , 5432, поэтому преобразование завершилось неудачно.
Итак, помните: если вы живете в странной стране, дважды проверьте настройки своей культуры.

Ответ 1

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

Ответ 2

{ price: '1,5' } 

должно быть хорошо.

Ответ 3

EDIT: вам нужно использовать пост jQuery? Есть ли способ использовать встроенную поддержку 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)

Ответ 4

Вы проверили, что такое ответ JSON с сервера? Я замечаю, что вы не инкапсулировали свою ценовую переменную двойными кавычками, поэтому ваше сообщение на сервере будет выглядеть следующим образом:

{'price':1.5}

Я не знаю, будет ли это проблемой только с одним параметром данных, но я подозреваю, что вы на самом деле хотите, чтобы он выглядел следующим образом:

"{'price':1.5}"

jQuery методы ajax, передаваемые методам ASP.Net, должны иметь строку для параметра данных, иначе jQuery может сериализовать данные некорректно. Наличие строки означает, что jQuery оставит ваш объект JSON самостоятельно и передаст всю строку в ASP.NET для разбора на стороне сервера.

Ответ 5

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