Как отобразить только некоторые конкретные поля модели с InvariantCulture, в то время как остальные продолжают использовать культуру пользователей? - PullRequest
6 голосов
/ 14 марта 2011

У меня есть несколько скрытых входов в виде asv.net MVC. Их значения содержат объекты типа double. Я хочу, чтобы они отображались с InvariantCulture, так как они используются для подачи в API (Google Maps) на клиенте. Как и сейчас, они отображаются с запятой (,) в качестве десятичного разделителя, в то время как API ожидает точку (.) В качестве десятичного разделителя.

Лучшее решение было бы, если бы я мог указать культуру в атрибуте аннотации данных DisplayFormat в свойстве модели, но я не думаю, что это возможно:

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

Я также не могу просто установить CurrentCulture на InvariantCulture в моем методе Application_Start, поскольку на экране есть другие значения, которые должны соответствовать надлежащей пользовательской культуре.

Итак, есть ли способ просто временно изменить текущую культуру, прямо перед тем, как я сделаю Html.HiddenFor(Model => Model.Latitude) для этого конкретного свойства, а затем сбросить его?

Или есть другой лучший способ сделать это? Что считается лучшей практикой в ​​этом отношении?

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

Один из способов добиться этого - написать собственный шаблон редактора ~/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.

1 голос
/ 15 марта 2011

Я закончил тем, что создал шаблон (Position.chtml) для конкретного подобъекта Position в моей модели, например:

@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>

Таким образом, мне не нужно добавлять какие-либо атрибутык модельному классу.

Мне интересно, хотя ... это хорошая практика, включая javascript, как это?Я не знаю ни одного другого способа сделать это (кроме включения его в главную страницу, что я не хочу делать, поскольку мне это не нужно на всех страницах) без необходимости повторяться.Я хотел бы оставить это СУХОЙ ...

Также (я мог бы лучше задать новый вопрос для этого): Как сейчас, у меня есть этот шаблон 2 раза, один раз как шаблон редактора, один раз какшаблон отображения.Единственное отличие состоит в том, что последний параметр attachMap должен быть true для шаблона редактора и false для шаблона отображения.Есть ли простой способ сделать это СУХОЙ?

0 голосов
/ 06 августа 2013
    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);
    }
...