我正在努力使我的MVC应用程序尽可能高效。我刚刚遇到以下问题,我不确定是否可以在Entity Framework或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,并在DB上执行另一个数据库选择以获得之前的相同用户。它将对页面上的每个操作链接执行此操作。有没有更有效的方法来执行此操作,因此数据库选择只执行一次?
我应该指出我首先使用EF代码。我没有使用通用存储库或我自己的滚动工作单元。我正在使用MVC的第4版和实体框架的v4.3。