2016-03-05 8 views
-1

У меня есть база данных, где у меня есть TimeStart и TimeEnd, поэтому я хочу получить только StudentName значений, которым они тридцать дней, чтобы закончить. Таким образом, каждый StudentName имеет TimeStart и TimeEndНельзя вычесть из DateTime

ViewModel:

public String StudentName { get; set; } 
    public List<SelectListItem> DurationDays { set; get; } 
    public int SelectedDurationDays { set; get; } 

Модель:

[Key] 
public int MyModelId { get; set; } 
public String StudentName { get; set; } 
public DateTime TimeStart{ get; set; } 
public DateTime TimeEnd{ get; set; } 

Так как вы можете видеть, я делаю SelectList пункт, чтобы создать новый TimeStart и TimeEnd, вот моя логика:

Создать Получить:

public ActionResult Create() 
{ 
    var vm = new StudentViewModel 
     { 
      DurationDays = new List<SelectListItem>() 
      { 
       new SelectListItem {Value = "1", Text = "1 year"}, 
       new SelectListItem {Value = "2", Text = "2 years"}, 
      }}; 
    return View(vm); 
} 

Создать сообщение

public async Task<ActionResult> Create([Bind(Include = "TimeStart,TimeEnd,StudentName,SelectedDurationDays")] StudentsViewModel model) 
{ 
    var endDate = DateTime.Now.AddYears(model.SelectedDurationDays); 
    var students = new Students 

    try 
    { 
     if (ModelState.IsValid) 
     { 
      StudentName = model.StudentName, 
      TimeStart = DateTime.Now, 
      TimeEnd = endDate 
     }; 

     db.WebPagesList.Add(students); 
     db.SaveChanges(); 

     return RedirectToAction("Index", "Student"); 
    } 
    catch (Exception) 
    { 
     //exception Return 
    } 
} 

Индекс GET:

public async Task<ActionResult> Index(WebPages model) 
{ 
     var datesub = model.DomainExp.AddDays(-30); 

     var datetimened = db.StudentList.Where(x => x.StudentName== model.StudentNAme 
       && x.TimeEnd<= datesub); 
     var StudentList = db.StudentList.Include(w => w.Student); 
     return View(await StudentList.ToListAsync()); 
} 

Так что моя попытка проверить значения, которые собираются закончиться:

var datesub = model.TimeEnd.AddDays(-30); 
var datetimened = db.MyModelList.Where(x => x.StudentName == model.StudentName && x.TimeEnd<= datesub); 

Но Я получаю сообщение об ошибке:

The added or subtracted value results in an un-representable DateTime.

на этой линии:

var datesub = model.TimeEnd.AddDays(-30); 

Что я делаю не так с моим запросом? Я только хочу, чтобы выбрать StudentName, который находится рядом с TimeEnd

EDIT

Как комментарием @Stephen Muecke, мне нужно установить TimeEnd в методе GET, как я могу сделать, если я не есть TimeEnd перед публикацией (я создаю его, когда отправляю нового студента)?

+1

Каково значение 'TimeEnd', когда вы вызываете этот запрос? –

+0

'TimeEnd' назначается в зависимости от выбранных дней продолжительности, например, если я выбираю« 1 год »в моем представлении создания, мой« TimeEnd »- это« DateTime.Now »+« DateTime.Now.AddYears (1) », я пытаюсь чтобы получить StudentName, что 'TimeEnd' составляет около 30 дней в представлении списка индексов –

+0

Я предлагаю вам отлаживать ваш код и проверять фактическое значение - его почти наверняка' 1/1/0001', как указал Дарин Димитров –

ответ

1

Как уже упоминалось, вы вычитаете недействительную точку.

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

var datediff = DateTime.Now.AddDays(30); 
var studentsAboutToExpire = db.MyModelList 
    .Where(x => x.StudentName == model.StudentName && x.TimeEnd<= datediff); 
+0

ВЫ ПОЛНОСТЬЮ ПРАВО! –

2

Если model.TimeEnd по умолчанию неинициализирован DateTime.MinValue (1/1/0001 12:00:00 AM), тогда попытка вычесть из него 30 дней не будет работать. Убедитесь, что это свойство было заполнено реальным временем, прежде чем пытаться вычесть его.

Я полагаю, что это значение просто не было заполнено, когда вы отправили значение обратно в действие «Опубликовать».

+0

'TimeEnd' назначается в зависимости от выбранных длительности дней, например, если я выбираю« 1 год »в моем представлении, мой« TimeEnd »- это« DateTime.Now' + »DateTime.Now.AddYears (1)' –

+0

OK, теперь убедитесь, что это значение действительно достигает вашего действия Post и что вы правильно присвоили реальную дату DateTime для свойства 'model.TimeEnd' перед вызовом' .Add (-30) 'на нем. –

+0

Я иду на свой ServerExplorer, а 'TimeEnd' -' 03/03/2017 12:00:00 a. m.' после моего сообщения, мой запрос находится в индексе не 'POST', я хочу только получить это значение, вычесть 30 дней и получить' StudentName', которые подходят к '03/03/2017 12:00:00 a. m.' -30 дней –

Смежные вопросы