Связыватель модели ASP.NET MVC с глобальными числовыми форматами - PullRequest
9 голосов
/ 19 февраля 2011

Связыватель модели по умолчанию возвращает ошибки для свойств, имеющих тип double, когда мое приложение используется в странах, которые используют различное форматирование чисел для десятичных чисел (например, 1.2 = 1,2). Культура сайта задается в моем BaseController условно.

Я попытался добавить привязку пользовательской модели и переопределить функцию bindModel, но я не вижу, как обойти эту ошибку, поскольку для культуры уже установлено значение по умолчанию en-GB.

Поэтому я попытался добавить фильтр действий в свой BaseController, который устанавливает там Культуру, но, к сожалению, bindModel, похоже, срабатывает до моего фильтра действий.

Как я могу обойти это? Или заставить Культуру не сбрасывать себя или установить ее обратно до того, как включится bindModel?

Контроллер, в котором модель становится недействительной:

public ActionResult Save(MyModel myModel)
{
    if (ModelState.IsValid)
    {
        // Save my model
    }
    else
    {
       // Raise error
    }
}

Фильтр, в котором установлена ​​культура:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    CultureInfo culture = createCulture(filterContext);

    if (culture != null)
    {
         Thread.CurrentThread.CurrentCulture = culture;
         Thread.CurrentThread.CurrentUICulture = culture;
    }

    base.OnActionExecuting(filterContext);
}

Пользовательская модель Binder:

public class InternationalDoubleModelBinder : DefaultModelBinder
{
   public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   {
       ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
       if (valueResult != null)
       {
           if (bindingContext.ModelType == typeof(double) || bindingContext.ModelType == typeof(Nullable<double>))
           {
               double doubleAttempt;

               doubleAttempt = Convert.ToDouble(valueResult.AttemptedValue);

               return doubleAttempt;
           }
        }
        return null;
   }
}

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Вы хотите, чтобы ваше приложение использовало одну культуру, верно?Если это так, вы можете сделать это с тегом глобализации вашего web.config.

<configuration>
    <system.web>
        <globalization
           enableClientBasedCulture="true"        
           culture="en-GB"
           uiCulture="en-GB"/>
    </system.web>
</configuration>

А затем вы можете забыть эти пользовательские связующие модели и использовать значение по умолчанию.: Хорошо, это мультиязычное приложение.Как вы получаете культуру, которую вы хотите?Можете ли вы вызвать createCulture для класса MvcApplication?Вы можете сделать это:

public class MvcApplication : HttpApplication
{
    //...
    public void Application_OnBeginRequest(object sender, EventArgs e)
    {
        CultureInfo culture = GetCulture();
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;
    }
    //...
}

Этот метод вызывается до привязки модели, поэтому, опять же, вам не понадобится привязка пользовательской модели.Я надеюсь, что это работает для вас:)

0 голосов
/ 19 февраля 2011

Посмотрите в этой статье , но, для краткости, если вы можете попробовать это:

public ActionResult Create(FormCollection values)
{
    Recipe recipe = new Recipe();
    recipe.Name = values["Name"];      

    // ...

    return View();
}

... или это, если у вас есть модель:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Recipe newRecipe)
{            
    // ...

    return View();
}

В статье есть полные ссылки и другие способы сделать это.Я использую эти 2, и они были достаточно для меня до сих пор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...