MVC 3: использовать ОЧЕНЬ пользовательский формат для даты с автоматическим сопоставлением на стороне сервера - PullRequest
1 голос
/ 22 февраля 2012

У меня очень запутанная проблема, и я могу ее решить, но должно быть готовое решение.

Ситуация следующая: Пользователь вводит на стороне клиента дату (т.е. с помощью средства выбора даты), которая выводит в текстовое поле следующее значение:

Ми 22.02.2012 (KW 8)

У меня есть кнопка, которая отправляет мою форму с этим текстовым полем в действие контроллера. Допустим, у вас есть следующее действие контроллера, которое принимает MyType в качестве параметра

[HttpPost]
public ActionResult Create(MyType model)
{
    //model.Date is always null
    //(or in case the DateTime is not Nullable<T>, the value is DateTime.Min
}

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

Вопрос прост: Как мне сопоставить ввод с DateTime?

Я не хочу добавлять свойства в мой класс, как в следующем примере:

public class IDontWantThis
{
    public DateTime? Date { get { /* Some custom string parsing with DateText */ } }
    public string DateText { get; set; } //this would be the auto-mapped property
}

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

То, как дата отображается в представлении, не имеет значения для контроллера.

Я бы добавил скрытое поле с названием свойства, которое вы хотите, чтобы дата и время отображались в модели представления (Date).На клиенте, используя javascript, вы можете форматировать эту дату любым способом, если скрытое поле содержит дату и время, с которыми вам нужно работать.

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

1 голос
/ 22 февраля 2012

Для этого предназначены ViewModels. Я понимаю, что вы не хотите, чтобы модель вашего домена включала DateText участника, но вам действительно следует рассмотреть что-то вроде этого:

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

public class MyTypeViewModel
{
    public MyType MyType { get; set; }
    public string DateText { get; set; }
}

То, что вы требуете, является одним из основных моментов, которые делают ViewModels настолько мощными Использование промежуточного класса между вашим View и вашей моделью, чтобы связать их вместе. Таким образом, вы не будете иметь никаких следов «форматирования» данных в вашей модели (MyType).

...