2015-03-13 2 views
0

Работа в визуальной студии и наличие текущего кода в классе контроллера GroupController. На странице групп я могу создать новую группу. Затем пользователь вводит значения String для groupName, groupAssignment, groupLocation и GroupDateTime. Код, который я имею до сих пор, приведен ниже, но он изо всех сил пытался найти рабочее сравнение для дат. Я хочу убедиться, что дата ввода больше текущей. Если нет, это не позволит пользователю создать группу. Какие-либо предложения? СпасибоПодтверждение ввода даты asp.net

public ActionResult Create([Bind(Include = "GroupID,GroupName,GroupAssignment,GroupLocation,GroupDateTime")] Group group) 
    { 
     var currentUser = manager.FindById(User.Identity.GetUserId()); 

     try 
     { 
      group.User = manager.FindById(User.Identity.GetUserId()); 
      db.Groups.Add(group); 
      db.SaveChanges(); 
      return RedirectToAction("Index");   
     } 
     catch (Exception /* dex */) 
     { 
      if(group.User == null) 
      { 
       ModelState.AddModelError("", "No user logged in"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "Unhandled Error"); 
      } 
     } 
     return View(group); 
    } 
+0

Вы когда-нибудь пытались разобрать свое 'GroupDateTime' на' DateTime' и сравнить его с 'DateTime.Now' или чем-то еще? –

+0

да, я попытался использовать 'if (group.GroupDateTime KimCheeFatChoyProgrammer

+0

От вас вопрос звучит как 'group.GroupDateTime' - это' string' (это правильно?), так что сравнение не будет работать. Сначала вам нужно преобразовать строку в 'DateTime'. Вы должны хотя бы сделать это, чтобы определить, будете ли вы работать, действительная дата и время. – MotoSV

ответ

1

Я предлагаю вам использовать специальную проверку на вашей модели (группе). Вы можете использовать CustomAttribute на GroupDateTime собственности, как показано ниже:

[AttributeUsage(AttributeTargets.Property)] 
public class FutureDateValidation : ValidationAttribute { 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) { 
     DateTime inputDate = (DateTime)value; 

     if (inputDate > DateTime.Now) { 
      return ValidationResult.Success; 
     } else { 
      return new ValidationResult("Please, provide a date greather than today.", new string[] { validationContext.MemberName }); 
     } 
    } 
} 


public class Group { 
    [FutureDateValidation()] 
    [DataType(DataType.Date, ErrorMessage = "Please provide a valid date.")] 
    public DateTime GroupDateTime { get; set; } 
} 

Для гарантии валидации типа данных, вы должны использовать атрибут [DataType (DataType.Date)]. И вы можете использовать скрипт на стороне клиента, чтобы поместить маски, используя, например, jquery-ui.

Кроме того, вы можете заменить «no user logged» с атрибутами [Authorize] в вашем контроллере или действии и «Unhandled Error» переопределить HandleException на базовом контроллере.

Я настоятельно рекомендую использовать декларативную проверку. http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

+0

Ах! конечно, это сработало очень хорошо. Я никогда не знал, как реализовать пользовательскую проверку, так что спасибо за это. Я также буду работать в атрибутах [Авторизовать]. – KimCheeFatChoyProgrammer

+0

Отличное видео об ASP.Net MVC Security: http://pluralsight.com/training/Player?author=scott-allen&name=mvc4-building-m7-security&mode=live&clip=0&course=mvc4-building –

1

Перед вашего try заявления вы можете использовать DateTime.TryParse. Если это возвращает false, добавьте ошибку в ModelState. Если он возвращает true, у вас есть действительная дата и время, которое вы можете сравнить с DateTime.Now.

Итак:

DateTime temp; 
if(!DateTime.TryParse(group.GroupDateTime, out temp)) 
{ 
    this.ModelState.AddError(....); 
    return /* add action result here */ 
} 

if(temp < DateTime.Now) 
{ 
    this.ModelState.AddError(....) 
    return /* add action result here */ 
} 

...everything else... 

UPDATE # 1: Вы должны думать об изменении свойств Group более сильно типизированных, так что изменить GroupDateTime к DateTime. Это также позволит вам использовать встроенные атрибуты проверки, такие как MaxLengthAttribute, RequiredAttribute и т. Д.

+0

Я попытался реализовать это здесь, и полученные ошибки не могут преобразовать System Time в String. Есть предположения? – KimCheeFatChoyProgrammer

+0

Вы уверены, что строка, передаваемая в 'GroupDateTime', является допустимым« DateTime »? Если нет, то добавление проверки в ваш метод приведет к его захвату, и вы должны добавить дополнительную проверку на стороне клиента, чтобы обеспечить правильность ввода 'DateTime'. Попробуйте изменить элемент управления пользовательского интерфейса, чтобы разрешить только дату/время. – MotoSV

+0

Я продолжу попытку найти несколько способов пойти после этого. Это была первая проблема, с которой я столкнулся. Валидация позаботилась об этом. Спасибо @MotoSV – KimCheeFatChoyProgrammer

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