2015-01-20 2 views
0

Есть ли способ проверить, какой метод View вызывается в ASP.NET MVC?Проверьте, какой метод просмотра в контроллере вызывается ASP.NET MVC

Например, у меня есть простой статический метод, который возвращает сообщения из базы данных, и у меня есть два представления, которые делают подобное, но все-таки не то же самое. На одном из представлений я публикую сообщение от зарегистрированного пользователя, а с другой - показываю сообщения от всех пользователей (представьте, что, как страницы 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 присутствует, а не пусто, покажите только сообщения для пользователя с этим идентификатором. Я считаю, что это сработает, но меня интересует какой-нибудь другой, более хороший способ сделать это. Может ли ASP.NET MVC и C# делать что-то вроде этого? Эти два представления делают подобные вещи, и я хотел бы избежать ненужного избыточности кода.

+1

Возможно, вы можете использовать 'Request.UrlReferrer', который находится в' HttpContext'. –

+0

Еще одна вещь - не связана с вопросом, но стоит знать. Ваш метод считывает все записи из db в память (listPosts = listPosts.Reverse(). ToList()), а затем создает «страницу» с пропуском и записью. Вы должны рассмотреть возможность передачи startindex и блокировать запрос - когда ваше приложение станет зрелым, и предположим, что миллионы сообщений, загрузка всех из них, чтобы просто фильтровать последние 20, будет огромной тратой ресурсов – cyberhubert

+0

@cyberhubert Хорошая точка. Вы совершенно правы. Это просто тестовое приложение, поэтому у него не будет 20 миллионов сообщений, но это точка тестовых приложений, предсказать возможные сценарии в будущем :) –

ответ

1

Вы можете передать UserId как nullable 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? однако это было бы кошмаром в дальнейшей работе с этим кодом. Также - у вас есть вопрос, как тестировать такой звонок?

Смежные вопросы