Asp.net mvc 4 正在寻找在asp.net mvc中处理控制器操作内部条件逻辑的最佳实践

Asp.net mvc 4 正在寻找在asp.net mvc中处理控制器操作内部条件逻辑的最佳实践,asp.net-mvc-4,custom-action-filter,Asp.net Mvc 4,Custom Action Filter,目前,我正在寻找在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");**

目前,我正在寻找在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
        {

        }
    }                
}
我不确定这是否是处理此类情况的最佳做法。那么,有人能给点建议吗

问候,,
Ram

通常,您不会对web应用程序的所谓业务逻辑使用操作过滤器-这就是控制器的用途。操作过滤器更适合于实际逻辑之外的所有内容-常见情况是日志记录、性能度量、检查用户是否经过身份验证/授权(我认为这不是您的情况,尽管您在“项”上调用了IsAuthorized方法)

减少代码通常是一件好事,但在这种情况下,我不认为将逻辑付诸行动是一个好方法,因为你;我实际上让它有点不可读,我认为不可读的代码比重复的代码更糟糕。 另外,特别是在您的情况下,对于所有有效项,您实际上会调用两次_todoListItemsRepository.Find()(对于每个有效项),如果这是一些webservice调用或db查找,那么这可能会很昂贵

如果代码只是在整个操作过程中重复,则从中生成一个方法,如下所示:

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

有人能回答我的问题吗?如果你的代码按预期工作,并且没有导致错误,那么这个网站在网络中并不适合你的问题。您可以尝试代码检查。