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, а также тип ******. Кроме того, эта функция работает, когда я отправляю целочисленные данные (если я посылаю 1, этот контроллер вызывается, а float? price заполняется должным образом). Я что-то упустил, или это ошибка?

Ad. Я могу получить цену как строку, а затем проанализировать ее вручную, но мне не нравится это решение, поскольку оно не изящно, и оно борется с целями использования фреймворка как MVC, чтобы сделать это для меня.

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

class ***************** : IModelBinder
{
 #region IModelBinder Members
 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
 {
 string numStr = bindingContext.*************[bindingContext.ModelName].AttemptedValue;
 ****** res;
 if (!******.TryParse(numStr, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out res))
 {
 if (bindingContext.ModelType == typeof(******?))
 return null;
 throw new ArgumentException();
 }
 if (bindingContext.ModelType == typeof(******?))
 return new Nullable<******>(res);
 else
 return res;
 }
 #endregion
}
</******>

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

Btw. Любые идеи, почему плавает и удваивается, не работают из коробки (для меня?)?

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

5 ответов

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


{ price: '1,5' }

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


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)


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

{'price':1.5}

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

"{'price':1.5}"

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


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

licensed under cc by-sa 3.0 with attribution.