Asp.net mvc 4 正在寻找在asp.net mvc中处理控制器操作内部条件逻辑的最佳实践
目前,我正在寻找在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");**
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; }
有人能回答我的问题吗?如果你的代码按预期工作,并且没有导致错误,那么这个网站在网络中并不适合你的问题。您可以尝试代码检查。