如何使用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); }