Вызов связывателя модели по умолчанию из связывателя пользовательской модели? - PullRequest
4 голосов
/ 20 июня 2011

Я написал пользовательский связыватель модели, который должен отображать даты, поступающие из строк URL-адресов (GET) в соответствии с текущей культурой (здесь приведен фрагмент кода: связыватель модели по умолчанию не учитывает текущую культуру, если вы используете GEThttp-call ...).

public class DateTimeModelBinder : IModelBinder
{

    #region IModelBinder Members
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {

        if (controllerContext.HttpContext.Request.HttpMethod == "GET")
        {
            string theDate = controllerContext.HttpContext.Request.Form[bindingContext.ModelName];
            DateTime dt = new DateTime();
            bool success = DateTime.TryParse(theDate, System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None, out dt);
            if (success)
            {
                return dt;
            }
            else
            {
                return null;
            }
        }

        return null; // Oooops...

    }
    #endregion
}

Я зарегистрировал подшивку модели в global.asax:

ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder());

Теперь проблема возникает в последнем return null;.Если я использую другие формы с POST, он перезапишет уже сопоставленные значения с нулем.Как я могу избежать этого?

Thx для любых входов.sl3dg3

Ответы [ 2 ]

6 голосов
/ 20 июня 2011

Получите из DefaultModelBinder и затем вызовите базовый метод:

public class DateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // ... Your code here

        return base.BindModel(controllerContext, bindingContext);
    }

}
4 голосов
/ 20 июня 2011

Ну, на самом деле это тривиальное решение: я создаю новый экземпляр связывателя по умолчанию и передаю ему задание:

public class DateTimeModelBinder : IModelBinder
{

#region IModelBinder Members
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{

    if (controllerContext.HttpContext.Request.HttpMethod == "GET")
    {
        string theDate = controllerContext.HttpContext.Request.Form[bindingContext.ModelName];
        DateTime dt = new DateTime();
        bool success = DateTime.TryParse(theDate, System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None, out dt);
        if (success)
        {
            return dt;
        }
        else
        {
            return null;
        }
    }

    DefaultModelBinder binder = new DefaultModelBinder();
    return binder.BindModel(controllerContext, bindingContext);

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