【问题标题】:Check from which view method in controller got invoked ASP.NET MVC检查从控制器中的哪个视图方法调用了 ASP.NET MVC
【发布时间】:2015-01-20 07:20:09
【问题描述】:

有没有办法检查 ASP.NET MVC 中哪个 View 调用了方法?

例如,我有一个简单的静态方法,它从数据库中返回帖子,我有两个视图在做类似的事情,但仍然不一样。 在一个视图中,我列出了登录用户的帖子,而在另一个视图中,我正在显示来自所有用户的帖子(想象一下,就像 Facebook 页面一样,在墙上你只能看到你的帖子,而在 NewsFeed 页面上你可以看到两者你和你朋友的帖子)。

所以我的具体问题是,我可以实现我的方法来做这样的事情吗:

public static List<Post> GetPosts(int BlockNumber, int BlockSize, string id)
        {
            ApplicationDbContext db = new ApplicationDbContext();

            int startIndex = (BlockNumber - 1) * BlockSize;
            var listPosts = db.Posts.ToList();
            if (METHOD INVOKED FROM ProfilePage SHOW ONLY CURRENT USER POSTS)
            {
                listPosts = listPosts.Where(p => p.UserId ==   id).Reverse().ToList();
            }
            else if(METHOD INVOKED FROM NEWSFEED SHOW ALL USERS POSTS)
            {
                listPosts = listPosts.Reverse().ToList();
            }
            var posts = listPosts.Skip(startIndex).Take(BlockSize).ToList();
            return posts;
        }

我的想法是简单地从 NewsFeedController 为 id 发送空字符串,然后检查 id 是否为空显示所有帖子,如果 id 值存在且不为空,则仅显示具有该 id 的用户的帖子。我相信这会奏效,但我很感兴趣是否有其他更好的方法来做到这一点。 ASP.NET MVC 和 C# 可以做这样的事情吗?这两个视图在做类似的事情,我想避免不必要的代码冗余。

【问题讨论】:

  • 也许你可以使用Request.UrlReferrer,它位于HttpContext中。
  • 还有一件事 - 与问题无关,但值得了解。您的方法将所有记录从 db 读取到内存中(listPosts = listPosts.Reverse().ToList()),然后使用跳过和获取创建一个“页面”。您应该考虑将 startindex 和 blocksize 传递给查询 - 当您的应用程序变得成熟并且假设有数百万个帖子时,加载所有帖子以仅过滤最后 20 个将是巨大的资源浪费
  • @cyberhubert 好点。你是完全正确的。这是一个刚刚测试的应用程序,所以它不会有 2000 万个帖子,但这是测试应用程序的重点,预测未来可能的情况:)

标签: c# asp.net-mvc asp.net-mvc-4 controller


【解决方案1】:

您可以将 UserId 作为可为空的 int 传递,并从您的控制器以显式方式调用它。我的意思是这样的:

public static List<Post> GetPosts(int BlockNumber, int BlockSize, string id, int? userId)

这样您可以获得干净可读的界面,而 GetPosts 方法中没有任何“魔法”。

如果您确定要遵循“已知呼叫者”的想法,可以在此处阅读有关此主题的更多信息:How can I find the method that called the current method? 但是,这将是进一步使用此代码的噩梦。另外 - 你有没有想过如何测试这样的电话?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多