2014-12-29 38 views
0

目前我正在尋找處理asp.net mvc中控制器操作內部條件的最佳實踐。例如 -尋找最佳實踐來處理asp.net中控制器操作中的條件邏輯mvc

public ActionResult Edit(int Id = 0) 
{ 
    var Item = _todoListItemsRepository.Find(Id); 
    **if (Item == null) 
     return View("NotFound"); 
    if (!Item.IsAuthorized()) 
     return View("NotValidOwner");** 

    return View("Edit", Item); 
} 

以粗體標記的上述兩個條件中的控制器內部其他動作被使用。所以,爲了不在所有的行爲中重複這些條件。我已經使用了下面的方法。

[HttpGet]  
[Authorize] 
[ModelStatusActionFilter] 
public ActionResult Edit(int Id = 0) 
{ 
    var Item = _todoListItemsRepository.Find(Id);   
    return View("Edit", Item); 
} 


public class ModelStatusActionFilterAttribute : ActionFilterAttribute 
{ 
    private readonly ITodoListItemsRepository _todoListItemsRepository; 
    public ModelStatusActionFilterAttribute() 
     : this(new TodoListItemsRepository()) 
    { 

    } 
    public ModelStatusActionFilterAttribute(ITodoListItemsRepository  todoListItemsRepository) 
    { 
     _todoListItemsRepository = todoListItemsRepository; 
    } 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     try 
     { 
      var Id = Convert.ToInt32(filterContext.RouteData.Values["Id"]); 
      var Item = _todoListItemsRepository.Find(Id); 
      if (Item == null) 
      { 
       filterContext.Result = new ViewResult() { ViewName = "NotFound" }; 
      } 
      else if (!Item.IsAuthorized()) 
      { 
       filterContext.Result = new ViewResult() { ViewName = "NotValidOwner" }; 
      } 
     } 
     catch 
     { 

     } 
    }     
} 

我不確定這是否是處理此類情況的最佳做法。那麼,有人可以請指教嗎?

問候, 拉姆

+0

可有人請回答我的問題? –

+0

如果您的代碼按預期工作並且不會導致錯誤,那麼這不完全是您的問題在網絡中的正確站點。你可以試試Code Review。 http://codereview.stackexchange.com/ – Claies

回答

0

通常不使用動作過濾器爲Web應用程序的所謂的商業邏輯 - 這就是控制器是。 Action過濾器相當於整個實際邏輯外部的東西 - 常見的情況是日誌記錄,性能測量,檢查用戶是否經過身份驗證/授權(我不認爲這是您的情況,但您調用IsAuthorized方法的「項目」)。

減少代碼總的來說是件好事,但在這種情況下,我認爲將邏輯放在行動上並不是一個好方法,因爲你實際上已經使它變得難以理解,而且在我看來,不可讀的代碼更糟比重複的代碼。 此外,特別是在你的情況下,對於所有有效的項目,你實際調用_todoListItemsRepository.Find()兩次(對於每個有效項目),如果這是一些webservice調用或db查找可能代價很高。

如果代碼只是重複整個動作,做出來的是一個方法,如:

private View ValidateItem(Item) { 
    if (Item == null) 
     return View("NotFound"); 
    if (!Item.IsAuthorized()) 
     return View("NotValidOwner"); 
return null; }