【发布时间】: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