ASP.NET MVC2: привязка модели DateTime через HTTP GET - PullRequest
1 голос
/ 03 сентября 2010

У меня возникают проблемы с привязкой даты из QueryString:

У меня есть следующая модель

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

И следующее действие контроллера:

public ActionResult Search( QueryParms query );

У меня есть форма с полем, где я могу ввести свою дату.Если форма FormMethod.Post, все в порядке, моя дата правильно привязана к моей модели.

Если форма FormMethod.Get, она больше не работает.Для даты оставлено значение по умолчанию (01/01/0001)

Я думаю, что это проблема культуры: когда я смотрю на поставщика значений, FormValueProvider имеет свойство культуры, установленное для моей даты: {fr-FR}.QueryStringValueProvider не имеет установленного свойства культуры.

Есть ли способ установить это свойство?

1 Ответ

1 голос
/ 03 сентября 2010

Кажется, что это было задумано:

http://www.pagedesigners.co.nz/2009/12/asp-net-mvc-datetime-binding-and-culture-unaware-urls/

И решение (из: Проблема CultureInfo с двойным связыванием моделей в asp.net-mvc (2) ) должен написать новую модель связующего:

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var culture = GetUserCulture(controllerContext);

        string value = bindingContext
            .ValueProvider
            .GetValue(bindingContext.ModelName)
            .ConvertTo(typeof(string)) as string;

        if (string.IsNullOrEmpty(value))
        {
            return null;
        }

        return DateTime.Parse(value, culture.DateTimeFormat);
    }

    public CultureInfo GetUserCulture(ControllerContext context)
    {
        var request = context.HttpContext.Request;
        if (request.UserLanguages == null || request.UserLanguages.Length == 0)
            return CultureInfo.CurrentUICulture;

        return new CultureInfo(request.UserLanguages[0]);
    }
}
...