Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅使用不变量区域性渲染某些特定的模型字段,而其余字段继续使用用户区域性?_C#_Asp.net Mvc_Formatting_Render_Culture - Fatal编程技术网

C# 如何仅使用不变量区域性渲染某些特定的模型字段,而其余字段继续使用用户区域性?

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

我在asp.net mvc视图上有几个隐藏的输入。它们的值包含类型为
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
布尔参数的信息。