2012-08-07 17 views
2

我正在使用帶有Razor視圖的ASP.NET MVC 3。我有一個控制器中有兩個操作方法(Get和Post),它們有一個相應的視圖(.cshtml文件)。在我的應用程序中,我只想在一年的特定時間允許訪問該視圖,我們稱之爲「可訪問的日期範圍」。在所有時間不在可訪問的日期範圍內,我希望應用程序向用戶提供錯誤消息而不是顯示頁面。什麼是這樣的好方法?在控制器方法上可以使用自定義屬性嗎?邏輯應該直接在兩個控制器方法中進行嗎?我應該只在視圖文件中使用if語句以及適當的邏輯嗎?我並不瘋狂把這個邏輯放在一個視圖文件中,並且想要一個更乾淨的選項的建議。ASP.NET MVC 3基於一年中的時間/可訪問日期範圍限制對視圖的訪問

+0

感謝大家的快速回復。聽起來像你們(John H,Mark Oreta和KingCronus)一致。首先回應接受的答案,但我讚賞其他人的補充評論。 – neizan 2012-08-07 12:59:52

回答

1

最簡單的答案是把邏輯控制器內:

public ActionResult SummerOnly() 
{ 
    if (!(DateTime.Now > new DateTime(2012,8,8))) 
     return View("Error");  

    return View("GoodView"); 
} 
1

您可以創建一個自定義屬性,但我的偏好是將邏輯放入控制器中。我只傾向於使用自定義屬性,如果我知道這是我將在應用程序內反覆使用的東西。

然後,它是一個簡單的情況,檢查日期是否在特定的日期,然後發射到不同的視圖取決於結果。

它不應該在視圖中,因爲我認爲你已經從你的問題中知道。

1

要做到這一點最簡單的方法是將邏輯放在操作方法中。當然,不要這麼做,因爲這不是觀點的責任。你可以爲此創建一個屬性,如果你打算重用它,我肯定會走這條路線,否則我會保持簡單,只需將邏輯放在動作方法中。

0

對於一次性使用的話,那麼一個屬性是矯枉過正,但如果你確實需要重用的邏輯那麼屬性是理想。事情是這樣的:

public class RestrictDate : ActionFilterAttribute 
{ 
    private int _monthFrom ; 
    private int _monthTo; 

    private int _dayFrom = 1; 
    private int _dayTo = 0; 

    public RestrictDate(int monthFrom, int monthTo) 
    {    
     _monthFrom = monthFrom; 
     _monthTo = monthTo; 

    } 

    public RestrictDate(int monthFrom, int dayFrom, int monthTo, int dayTo) 
     : this(monthFrom, monthTo) 
    { 
     _dayFrom = dayFrom; 
     _dayTo = dayTo; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     DateTime minDate = new DateTime(DateTime.Today.Year, _monthFrom, _dayFrom); 

     int interval = _monthFrom <= _monthTo ? _monthTo - _monthFrom : 12 - _monthFrom + _monthTo; 

     DateTime maxDate; 
     if (_dayTo == 0) 
     { 
      maxDate = minDate.AddMonths(interval + 1).AddDays(-1); 
     } 
     else 
     { 
      maxDate = new DateTime(DateTime.Today.Year, _monthFrom, 1).AddMonths(interval).AddDays(_dayTo - 1); 
     } 

     if (DateTime.Today < minDate || DateTime.Today > maxDate) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Home", 
       action = "Error" 
      })); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

很顯然,這是不是生產準備代碼 - 不存在輸入驗證等,但我認爲你的想法。