@Html.HiddenFor(model => model.mx.ToString(new CultureInfo("en-us")));
编辑:
很抱歉简短的回答。我认为如果它有效的话会很有用,不幸的是我错过了你的代码中的一些重要内容。
您的问题是本地化问题。我猜你的机器运行的是欧洲文化。 (刚刚注意到您关于将其设置为西班牙语的评论)
ToString() 已经为一些基本类型重载,包括浮点数。这些重载之一接受 CultureInfo 实现的 IFormatProvider。通过使用美国英语的 culture code 传递 CultureInfo,您可以确保将使用点而不是逗号作为小数分隔符。
我错过的是 mx 是一个浮点数?,它是 Nullable 的缩写。 Nullable 不会以相同的方式重载 ToString,因此您有多种选择。
如果您使用的是 C#6,您可以使用空检查运算符来转换您的浮点数吗?回到浮动。然后你可以使用 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"))