Asp.net MVC выпуск десятичного символа - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть приложение Asp.net MVC с определенным представлением, в котором есть модель со свойством float.

Мой языковой стандарт сервера говорит, что , является десятичным символом, и он отлично работает, когда я редактирую свою модель и, например, введите 7,5 в текстовое поле и отправлю его на сервер. Связыватель модели по умолчанию может связать это значение, как ожидается, с семь с половиной .

Но когда я отображаю это же значение, используя <%= this.Model.FloatValue %>, десятичный символ преобразуется в ., что означает, что <%= %> явно игнорирует настройки локали сервера.

Итак. Как мне решить эту проблему тогда? Какой язык следует использовать? Язык системы сервера, который говорит, что десятичный символ равен ,, или параметр языка браузера, который установлен на en-gb, что означает, что . является десятичным символом.

Во всяком случае. Я просто хочу, чтобы это работало надежно.

Некий код:

Действия моего контроллера:

public ActionResult Settings()
{
    Settings result = this.Service.GetActiveSettings();
    return View(result);
}

[HttpPost]
[HandleModelStateException]
public ActionResult Settings(Settings data)
{
    if (!this.ModelState.IsValid)
    {
        throw new ModelStateException(); // my custom exception which isn't important here
    }
    Settings result = this.Service.SaveSettings(data);
    return Json(result);
}

Второй вызывается асинхронно с использованием $.ajax().

Соответствующая часть частичного вида:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Settings>" %>
<div class="data">Float value: <strong><%= this.Model.FloatValue %></strong></data>
<div class="data">Integer value: <strong><%= this.Model.IntValue %></strong></data>
...

Любой мой класс модели:

/// <summary>
/// Represents application specific settings.
/// </summary>
public class Settings
{
    /// <summary>
    /// Gets or sets the integer value.
    /// </summary>
    /// <value>Integer value.</value>
    [Required(ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "QuotaRequired")]
    [Range(0, 365*24, ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "QuotaRange")]
    public int IntValue { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "WorkdayRequired")]
    [Range(.5, 24.0, ErrorMessageResourceType = typeof(Resources.Settings), ErrorMessageResourceName = "WorkdayRange")]
    public float FloatValue { get; set; }
}

Как видите, здесь нет ничего необычного. Да и кстати: проверка диапазона на FloatValue тоже не работает.

Ответы [ 2 ]

0 голосов
/ 05 мая 2011

Использование пользовательских CultureInfo при преобразовании в строку

В конце я использовал метод ToString() и предоставил соответствующую информацию о культуре.Мне пришлось предоставить немного больше кода, но он работает, как и ожидалось:

<%= this.Model.FloatValue.ToString(new System.Globalization.CultureInfo("sl-SI") %>

И когда мне нужно использовать эту информацию о культуре несколько раз в одном и том же представлении, я просто создаю переменную представления и сохраняю ее, а затемиспользовать его с каждым экземпляром.

0 голосов
/ 01 декабря 2010

Вы пытались отключить клиентскую культуру?Вы можете найти его в разделе web.config, system.web.

<globalization enableClientBasedCulture="false"  />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...