如何使用InvariantCulture仅渲染某些特定的模型字段,而其余的则继续使用用户文化?
我在asp.net mvc视图上有几个隐藏的输入。 它们的值包含double
类型的对象。 我希望它们使用InvariantCulture
进行渲染,因为它们习惯于被提供给客户端上的api(谷歌地图)。 就像现在一样,它们使用逗号(,)作为小数分隔符进行渲染,而api则需要一个点(。)作为小数分隔符。
最好的解决方案是,如果我可以在模型的属性上的DisplayFormat
数据注释属性中指定文化,但我不认为这是可能的:
public class Position { [DisplayFormat(DataFormatString="{0:G}, CultureInfo.InvariantCulture")] public double Latitude; ... }
我不能在我的Application_Start
方法中将CurrentCulture
设置为InvariantCulture
,因为屏幕上还有其他值必须在适当的用户文化中。
那么,有没有办法暂时改变当前的文化,就在我为该特定属性执行Html.HiddenFor(Model => Model.Latitude)
之前,然后重置它?
或者还有另一种更好的方法吗? 什么是最佳做法?
实现此目的的一种方法是编写自定义编辑器模板~/Views/Shared/EditorTemplates/InvariantDouble.cshtml
:
@{ object modelValue = string.Format( System.Globalization.CultureInfo.InvariantCulture, ViewData.ModelMetadata.DisplayFormatString, ViewData.ModelMetadata.Model ); } @Html.TextBox("", modelValue, new { @class = "text-box single-line" })
然后在你的模型上:
[DisplayFormat(DataFormatString="{0:G}")] [UIHint("InvariantDouble")] public double Latitude;
最后是你的看法:
@Html.EditorFor(x => x.Latitude)
或者如果你希望你的应用程序中的所有双打行为都像这样使用~/Views/Shared/EditorTemplates/Double.cshtml
而不使用任何UIHint
。
我最终为我的模型中的特定子对象Position
创建了一个模板(Position.chtml),如下所示:
@model Models.Position @{ var latitude = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:G}", Model.Latitude); var longitude = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:G}", Model.Longitude); } @Html.Hidden("Latitude", latitude) @Html.Hidden("Longitude", longitude)
这样,我不需要向模型类添加任何属性。
我想知道…这是一个很好的做法,包括像这样的JavaScript? 我不知道有任何其他方法可以做到这一点(除了在母版页中包含它,我不想这样做,因为我不需要在所有页面上),而不必重复自己。 我想保持这个干……
另外(我可能最好问一个新问题):就像现在一样,我有2次这个模板,一次作为编辑器模板,一次作为显示模板。 唯一的区别是attachMap
的最后一个参数对于编辑器模板必须为false
,对于显示模板必须为false
。 有没有简单的方法来做这个干?
public static MvcHtmlString HiddenForInvariant(this HtmlHelper htmlHelper, Expression> expression) { var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var id = string.Format("{0}", metadata.PropertyName); var compile = expression.Compile(); string value = Convert.ToString(compile(htmlHelper.ViewData.Model), CultureInfo.InvariantCulture); var hidden = htmlHelper.Hidden(id, value).ToHtmlString(); return new MvcHtmlString(hidden); }