1

我正在尝试使我的 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。

4

0 回答 0