我正在尝试使我的 MVC 应用程序尽可能高效。我刚刚遇到以下问题,我不确定是否可以在实体框架或 MVC 中解决。
我有以下路线:
routes.MapRoute(
"UserNameRoute",
"{UserName}/{Action}",
new { controller = "UserName", action = "Index" },
new
{
UserName = new UserConstraint(DependencyResolver.Current.GetService<IUserRepository>())
});
然后是以下路由约束:
private readonly IUserRepository repository;
public UserConstraint(IUserRepository repository)
{
if (repository == null)
{
throw new ArgumentNullException("repository");
}
this.repository = repository;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (!values.ContainsKey(parameterName))
{
return false;
}
var siteRoot = (string)values[parameterName];
var user = this.repository.Users.FirstOrDefault(u => u.UserName == userName && !u.Archived);
if (user!= null)
{
values[parameterName] = user;
return true;
}
return false;
}
}
然后我的控制器对每个动作的所有需求是:
public ActionResult ExampleAction(User userName)
{
return this.View(userName);
}
这很好用,我可以让我的用户参与操作,一点问题都没有。问题来了,当我像这样在视图中放置一个操作链接时:
@Html.ActionLink("View some action or other", "someaction", new { UserName = Model.UserName }, new { @class = "myclass" })
上面的这个操作链接将按原样通过我的 IRouteConstraint 并在数据库上执行另一个数据库选择以获取它之前拥有的相同用户。它将为页面上的每个操作链接执行此操作。是否有更有效的方法来执行此操作,以便仅执行一次数据库选择?
我可能应该指出我首先在 EF 中使用代码。我没有使用通用存储库或我自己的滚动工作单元。我正在使用 MVC 版本 4 和实体框架 v4.3。