форматировать datetime в shortdatestring в представлении

#asp.net #asp.net-mvc-3

#asp.net #asp.net-mvc-3

Вопрос:

В моей модели у меня есть;

 public class ReportDetails 
{
    public DateTime? MailSent { get; set; }
    public DateTime? DateCompleted { get; set; }
}
  

В моем контроллере;

 var query = (from u in SessionHandler.CurrentContext.LennoxSurveyResponses
                             join c in SessionHandler.CurrentContext.MailingListEntries on u.SurveyCode equals c.SurveyCode
                             join cl in SessionHandler.CurrentContext.MailingLists on c.MailingListId equals cl.MailingListId
                             join ch in SessionHandler.CurrentContext.Channels on cl.ChannelId equals ch.ChannelId
                             join cg in SessionHandler.CurrentContext.ChannelGroups on ch.ChannelGroupId equals cg.ChannelGroupId
                             where ch.OrganizationId == 8
                             amp;amp; ch.ChannelId == model.ChannelId
                             select new ReportDetails
                             {
                                 MailSent = c.LetterDate,
                                 DateCompleted = c.EmailDate
                             });
            model.Report = query.ToList();
  

Теперь, на мой взгляд, у меня есть

 @foreach (var tr in Model.Report)
                {
                    <tr>
                        <td>@tr.MailSent
                        </td>
                        <td>@tr.DateCompleted
                        </td>
                    </tr>
  

Когда отображаются результаты, MailSent и DateCompleted имеют как дату, так и время. Я пытаюсь просто отобразить дату без времени. Если я попытаюсь @tr.MailSent.HasValue ? @tr.MailSent.Value.ToShortDateString() : @tr.MailSent; , то получу ошибку — Value cannot be null . Как бы я отображал только часть даты. Оба MailSent и DateCompleted являются обнуляемыми полями. Заранее спасибо.

Ответ №1:

У вас есть два варианта:

метод расширения:

 public static MvcHtmlString ShortDate(this DateTime? dateTime)
{
    if (dateTime.hasValue)
        return MvcHtmlString.Create(dateTime.ToShortDateString());
    else
        return MvcHtmlString.Create("Your other option");
}

View usage:
<td>@tr.MailSent.ShortDate()</td>
  

или встроенный:

 @(tr.MailSent.HasValue ? @tr.MailSent.Value.ToShortDateString() : DateTime.Now.ToString())
  

или значение по умолчанию

 @tr.MailSent.GetValueOrDefault().ToShortDateString()
  

Комментарии:

1. я получаю сообщение об ошибке в представлении: нет неявного преобразования между string и system.datetime? когда я попробую ваш встроенный вариант. Я проверю с первым.

2. @bladerunner нет, вам нужно заменить параметр «не имеет значения» на допустимое datetime. Я обновил свой пример, но последний вариант, вероятно, самый простой маршрут

3. Круто, это работает, @(tr.MailSent.Имеет значение? @tr.MailSent.Value. Тошортдатестринг() : строка. Пусто).. Спасибо!!

4. @bladerunner если это помогло, нажмите стрелку вверх в ответах 🙂

Ответ №2:

Сделайте это в коде, а не в представлении:

 select new ReportDetails
{
    MailSent = c.LetterDate.HasValue ? c.LetterDate.Value.ToShortDateString() : "",
    DateCompleted = c.EmailDate.HasValue ? c.EmailDate.Value.ToShortDateString() : "",
}
  

Тогда вам не придется беспокоиться о том, что Razor взорвется

 <tr>
    <td>@tr.MailSent</td>
    <td>@tr.DateCompleted</td>
</tr>
  

Комментарии:

1. Когда я пытаюсь это сделать, я получаю объект с нулевым значением, который должен иметь исключение значения.

2. Я тоже это пробовал.. Как отправленная по почте, так и дата завершения имеют значение null Datetime в моей модели. Чтобы попробовать ваше исправление, мне пришлось бы объявить их как string в моей модели. Когда я это делаю, я получаю сообщение об ошибке: LINQ to Entities не распознает метод ‘System. Строка для метода ‘shortdatestring()’, и этот метод не может быть преобразован в выражение хранилища.

3. убедитесь, что вы больше не ToShortDateString() изменяете свои свойства viewmodel, если вы измените свойства модели на string