Привязка параметров MVC 1 - PullRequest
       4

Привязка параметров MVC 1

1 голос
/ 12 апреля 2011

Я передаю дату на свой сервер в инвариантной культуре, следующий формат

'mm/dd/yy'

Привязка параметра в MVC не может проанализировать эту дату и возвращает ноль для параметра. Это объясняется тем, что IIS работает на компьютере с использованием английского языка («dd / mm / yy» работает просто отлично).

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

Convert.ChangeType('12/31/11', typeof(DateTime), CultureInfo.InvariantCulture);

, даже если дата является частью другого объекта ...

public class MyObj
{
    public DateTime Date { get; set; }
}

Мой метод контроллера выглядит примерно так ...

public ActionResult DoSomethingImportant(MyObj obj)
{
     // use the really important date here
     DoSomethingWithTheDate(obj.Date);
} 

Дата отправляется в виде данных Json, вот так ...

myobj.Date = '12/31/11'

Я пытался добавить реализацию IModelBinder к binderDictionary в global.asax

binderDictionary.Add(typeof(DateTime), new DateTimeModelBinder());

Это не работает, и не работает

ModelBinders.Binders.Add(typeof(DateTime), new DataTimeModelBinder());

Похоже, что некоторые люди захотят делать все время. Я не могу понять, почему вы анализируете даты и т. Д. В текущей культуре на сервере. Клиент должен был бы узнать культуру сервера только для того, чтобы отформатировать даты, которые сервер сможет проанализировать .....

Любая помощь приветствуется!

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Я решил проблему здесь, что я упустил, так это то, что в объекте дата и время были обнуляемыми

public class MyObj
{
    public DateTime? Date { get; set; }
}

Следовательно, мое связующее не собиралось.Если кому-то интересно, это то, что я сделал ....

  1. В global.asax добавлено следующее

    binderDictionary.add(typeof(DateTime?), new InvariantBinder<DateTime>());
    
  2. Созданотакой инвариантный переплет

    public class InvariantBinder<T> : IModelBinder
    {
        public object BindModel(ControllerContext context, ModelBindingContext binding)
        {
            string name = binding.ModelName;
    
            IDictionary<string, ValueProviderResult> values = binding.ValueProvider;
    
            if (!values.ContainsKey(name) || string.IsNullOrEmpty(values[names].AttemptedValue)
                return null;
    
            return (T)Convert.ChangeType(values[name].AttemptedValue, typeof(T), CultureInfo.Invariant);
        }
    }
    

Надеюсь, это пригодится кому-то еще .....

1 голос
/ 13 апреля 2011

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

public class UserCultureDateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        object value = controllerContext.HttpContext.Request[bindingContext.ModelName];
        if (value == null)
            return null;

        // Request.UserLanguages could have multiple values or even no value.
        string culture = controllerContext.HttpContext.Request.UserLanguages.FirstOrDefault();
        return Convert.ChangeType(value, typeof(DateTime), CultureInfo.GetCultureInfo(culture));
    }
}

...

ModelBinders.Binders.Add(typeof(DateTime?), new UserCultureDateTimeModelBinder());
0 голосов
/ 12 апреля 2011

Можно ли передать дату на сервер в формате ISO 8601 ? Я думаю, что сервер будет анализировать это правильно, независимо от его региональных настроек.

...