C# 如何仅使用不变量区域性渲染某些特定的模型字段,而其余字段继续使用用户区域性?
我在asp.net mvc视图上有几个隐藏的输入。它们的值包含类型为C# 如何仅使用不变量区域性渲染某些特定的模型字段,而其余字段继续使用用户区域性?,c#,asp.net-mvc,formatting,render,culture,C#,Asp.net Mvc,Formatting,Render,Culture,我在asp.net mvc视图上有几个隐藏的输入。它们的值包含类型为double的对象。我希望使用InvariantCulture呈现它们,因为它们通常会被提供给客户端上的api(谷歌地图)。现在,它们以逗号(,)作为小数分隔符呈现,而api希望以点(.)作为小数分隔符 最好的解决方案是,我可以在模型属性的DisplayFormat数据注释属性中指定区域性,但我认为这是不可能的: public class Position { [DisplayFormat(DataFormatStrin
double
的对象。我希望使用InvariantCulture
呈现它们,因为它们通常会被提供给客户端上的api(谷歌地图)。现在,它们以逗号(,)作为小数分隔符呈现,而api希望以点(.)作为小数分隔符
最好的解决方案是,我可以在模型属性的DisplayFormat
数据注释属性中指定区域性,但我认为这是不可能的:
public class Position
{
[DisplayFormat(DataFormatString="{0:G}, CultureInfo.InvariantCulture")]
public double Latitude;
...
}
我也不能在我的应用程序\u 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)
或者,如果您希望应用程序中的所有Double都像这样运行,请使用
~/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)
<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>
@model Models.位置
@{
var latitude=string.Format(System.Globalization.CultureInfo.InvariantCulture,
“{0:G}”,模型纬度);
var longitude=string.Format(System.Globalization.CultureInfo.InvariantCulture,
“{0:G}”,模型经度);
}
@隐藏(“纬度”,纬度)
@隐藏(“经度”,经度)
$(函数(){
附件地图($('mapCanvas'),$('Position_Latitude'),$('Position_Latitude'),true);
})
这样,我就不需要向模型类添加任何属性
不过我想知道。。。包含这样的javascript是一种好的实践吗?我不知道有什么其他方法可以不用重复我自己就可以做到(除了在母版页中包含它,我不想这样做,因为我不需要在所有页面上都包含它)。我想保持这个干燥
另外(我最好问一个新问题):现在,我有两次这个模板,一次作为编辑器模板,一次作为显示模板。唯一的区别是attachMap
的最后一个参数对于编辑器模板必须是true
,对于显示模板必须是false
。有没有一种简单的方法使其干燥?public static MvcHtmlString HiddenForInvariant(此HtmlHelper HtmlHelper,表达式)
public static MvcHtmlString HiddenForInvariant<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> 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);
}
{
var metadata=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
var id=string.Format(“{0}”,metadata.PropertyName);
var compile=expression.compile();
字符串值=Convert.ToString(compile(htmlhelp.ViewData.Model)、CultureInfo.InvariantCulture);
var hidden=htmlHelper.hidden(id,value).ToHtmlString();
返回新的MvcHtmlString(隐藏);
}
谢谢,但是如果我在属性上还有一个[HiddenInput(DisplayValue=false)]
属性呢?@fretje,然后重写HiddenInput.cshtml
。Brad Wilson在这篇博文中介绍了默认模板:我做的有点不同。。。看,旧邮件,但我还是会把我的两分钱。。。首先,您的脚本~/scripts/map.js
和谷歌地图脚本将在每次呈现此局部视图时包含在内。如果在给定视图中显示多个地图,则可能不好。此外,如果您有多个地图,您可能需要自定义mapCanvas
id,使其在页面中唯一。第三,您可以使用另一个由编辑器和显示模板调用的局部视图,并接收attachMap
布尔参数的信息。