@Html.HiddenFor(model => model.mx.ToString(new CultureInfo("en-us")));
Редактировать: Извините за короткий ответ. Я думаю, что было бы полезно, если бы это сработало, к сожалению, я пропустил что-то важное в вашем коде.
Ваша проблема связана с локализацией. Я предполагаю, что ваша машина работает с европейской культурой. (Только что заметил ваш комментарий о том, что он установлен как испанский)
ToString() был перегружен для некоторых основных типов, включая float. Одна из этих перегрузок принимает IFormatProvider, который реализует CultureInfo. Передавая CultureInfo с помощью culture code для английского языка США, вы можете убедиться, что точка будет использоваться вместо запятой в качестве разделителя десятичной дроби.
Что я пропустил, так это то, что mx является поплавком ?, что является сокращением для Nullable. Nullable не перегружает ToString таким же образом, поэтому у вас есть несколько альтернатив.
Если вы используете C# 6, вы можете использовать оператор null check для преобразования вашего поплавка? вернуться к поплавке. Затем вы можете использовать перегрузку ToString:
@Html.HiddenFor(model => model.mx?.ToString(CultureInfo.GetCultureInfo("en-us")));
В качестве альтернативы, вы можете использовать перегрузку String.Format, которая принимает как строку формата и IFormatProvider:
@Html.HiddenFor(model => String.Format(CultureInfo.GetCultureInfo("en-us"), "{0:#.##}", model.mx));
Я не хотел бы предложить изменения культура вашей нити, потому что это выделялось в вашем вопросе «без изменения остальной части моего проекта», которую я, возможно, ошибочно предположил, означает, что вы не хотите изменять форматирование других компонентов в своем приложении. Изменение культуры потоков по умолчанию может оказать большее влияние, чем вы ожидаете.
Редактирование 2: Вот моя попытка перегрузки с расширением, принимающего IFormatProvider. Это был просто эксперимент и его нельзя использовать в производстве ... Я включаю его исключительно ради интереса.
public static class HtmlExtensions
{
public static IHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IFormatProvider formatter)
{
var value = expression.Compile().Invoke(helper.ViewData.Model);
var modelMetadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
var property = typeof(TModel).GetProperty(modelMetadata.PropertyName);
var attribute = property.GetCustomAttributes(typeof(DisplayFormatAttribute), false).SingleOrDefault() as DisplayFormatAttribute;
var displayValue = String.Format(formatter, attribute?.DataFormatString ?? "{0}", value);
TagBuilder tagBuilder = new TagBuilder("input");
tagBuilder.MergeAttribute("type", "hidden");
tagBuilder.MergeAttribute("value", displayValue);
return MvcHtmlString.Create(tagBuilder.ToString());
}
}
Используйте его как этот
@Html.HiddenFor(mode => mode.myNumber, System.Globalization.CultureInfo.GetCultureInfo("en-us"))
Вы можете принудительно изменить тему 'CultureInfo.CurrentCulture' вашего потока, если вы хотите изменить глобально. – Dai
Я предполагаю, что атрибут 'DisplayFormat' здесь не нужен и что он возится с вашим входным значением. – cleftheris
Я стараюсь, что это хорошо работает, и мой CurrentCultur en-US –