#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