2015-03-13 171 views
0

在Visual Studio中工作,並在我的控制器類中使用名爲GroupController的當前代碼。在羣組頁面上,我可以創建一個新羣組。然後,用戶將輸入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'或其他東西比較? – 2015-03-13 12:53:07

+0

是的,我嘗試過使用if(group.GroupDateTime KimCheeFatChoyProgrammer 2015-03-13 12:58:22

+0

從你的問題聽起來像'group.GroupDateTime'是一個'string'(這是否正確?),所以比較不起作用。您需要先將字符串轉換爲「DateTime」。你至少應該這樣做,以確定你的工作是否會有效的日期和時間。 – MotoSV 2015-03-13 13:05:18

回答

1

我建議您在模型(組)上使用自定義驗證。你可以在GroupDateTime財產使用CustomAttribute,如下圖所示:

[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; } 
} 

爲了garantee數據類型的驗證,你應該使用屬性[數據類型(DataType.Date)。您可以使用客戶端腳本來放置遮罩,例如使用jquery-ui。

此外,您可以用控制器或操作中的[Authorize]屬性和基本控制器上的「Unhandled Error」重寫HandleException來替換「no user logged in」。

我強烈建議您使用聲明式驗證。 http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

+0

啊!當然,這工作非常好。我從來不知道如何實現自定義驗證,所以非常感謝。我也將在[授權]屬性中工作。 – KimCheeFatChoyProgrammer 2015-03-13 13:17:45

+0

關於ASP.Net MVC安全的偉大視頻: http://pluralsight.com/training/Player?author=scott-allen&name=mvc4-building-m7-security&mode=live&clip=0&course=mvc4-building – 2015-03-13 13:22:28

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... 

更新#1:你應該考慮改變Group性能更加強類型的,所以更改GroupDateTimeDateTime。這也將允許您使用內置的驗證屬性,如MaxLengthAttribute,RequiredAttribute等。

+0

我試圖在這裏實現這一點,並收到無法將系統時間轉換爲字符串的錯誤。有什麼想法嗎? – KimCheeFatChoyProgrammer 2015-03-13 13:12:26

+0

您確定傳入GroupDateTime的字符串是否爲有效的DateTime?如果沒有,那麼在你的方法中添加驗證就會捕獲這個,你應該在客戶端添加額外的驗證來確保輸入正確的DateTime。嘗試更改UI控件以僅允許日期/時間。 – MotoSV 2015-03-13 13:15:46

+0

我會繼續努力,找到多種方式去追求。那是我遇到的第一個問題。驗證照顧了這一點。謝謝@MotoSV – KimCheeFatChoyProgrammer 2015-03-13 13:19:16