Недавно я работаю с 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, поэтому преобразование завершилось неудачно.
Итак, помните: если вы живете в странной стране, дважды проверьте настройки своей культуры.