如何使用InvariantCulture仅渲染某些特定的模型字段,而其余的则继续使用用户文化?

fre*_*tje 6 c# asp.net-mvc formatting culture render

我在asp.net mvc视图上有几个隐藏的输入.它们的值包含类型的对象double.我希望它们能够被渲染,InvariantCulture因为它们习惯于被提供给客户端上的api(谷歌地图).就像现在一样,它们以逗号(,)作为小数分隔符进行渲染,而api则希望将点(.)作为小数分隔符.

最好的解决方案是,如果我可以DisplayFormat在模型的属性上的数据注释属性中指定文化,但我认为这不可能:

public class Position
{
    [DisplayFormat(DataFormatString="{0:G}, CultureInfo.InvariantCulture")]
    public double Latitude;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我也不能在我的方法中设置CurrentCultureto ,因为屏幕上还有其他值必须在适当的用户文化中.InvariantCultureApplication_Start

那么,有没有办法暂时改变当前的文化,就在我Html.HiddenFor(Model => Model.Latitude)为特定属性做一个之前,然后重置它?

或者还有另一种更好的方法吗?什么是最佳做法?

fre*_*tje 1

我最终为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) 
<p /> 
<div id="mapCanvas"></div>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript" src="@Url.Content("~/Scripts/maps.js")"></script>
<script type="text/javascript">
    $(function () {
        attachMap($('#mapCanvas'), $('#Position_Latitude'), $('#Position_Longitude'), true);
    }) 
</script>
Run Code Online (Sandbox Code Playgroud)

这样,我不需要向模型类添加任何属性。

但我想知道...包括这样的 javascript 是个好习惯吗?我不知道有任何其他方法可以做到这一点(除了将其包含在母版页中,我不想这样做,因为我不需要在所有页面上都使用它)而不必重复自己。我想保持这个干燥...

另外(我最好为此问一个新问题):就像现在一样,我有这个模板两次,一次作为编辑器模板,一次作为显示模板。唯一的区别是最后一个参数必须attachMap用于true编辑器模板和false显示模板。有没有简单的方法可以让这个变干?