Каковы преимущества использования базового класса ViewModel вместо @html.action для передачи данных в частичное представление?

#c# #asp.net-mvc #asp.net-mvc-4 #partial-views #razor-2

#c# #asp.net-mvc #asp.net-mvc-4 #частичные представления #razor-2

Вопрос:

У меня есть частичное представление, которое я хочу отобразить в нескольких представлениях, которые имеют разные модели представления. Рассматриваемый частичный вид отображается как часть страницы макета:

 @RenderPage("~/views/shared/_usernavbar.cshtml")
  

Поскольку модель представления на родительской странице каждый раз отличается, я не могу просто поместить нужные мне данные в ViewModel для каждой страницы, а затем ссылаться на нее в частичном представлении.

Я хочу, чтобы все оставалось строго типизированным, поэтому одним из возможных решений является создание базовой модели представления, которую я применяю к странице макета и добавляю к различным моделям представления, которые я буду использовать на разных страницах. Затем я могу ссылаться на базовую модель представления в моем частичном представлении. Однако я мог бы также просто отобразить свою часть, используя @Html.Действие, которое затем позволило бы мне вызывать любую модель представления, которая мне нравится в моем частичном представлении. Использование @Html.Действие также означало бы, что моему родительскому представлению не нужно было прикреплять модель представления.

Что я хотел бы знать, так это зачем мне использовать базовую модель представления вместо @Html.Действие в таком сценарии? Поскольку для обоих требуется отдельный вызов сервера для генерации данных для моего частичного представления, есть ли какие-либо недостатки в использовании @Html.Действие над базовой моделью представления?

редактировать — Я постараюсь добавить пример как можно более простой.

У меня есть представление, которое вызывает следующую ViewModel:

 public class CourseViewModel 
    {
        public int CourseID { get; set; }
        public string Title { get; set; }
        public string Country { get; set; }
    }
  

У меня есть частичное представление, для которого требуется следующая viewmodel (данные):

 public class UserInfoViewModel
{
    public int Stars { get; set; }
    public int XP { get; set; }
    public int Level { get; set; }
}
  

В родительском представлении вызывается первая модель представления:

 @model IEnumerable<OLTINT.ViewModels.CourseViewModel>
  

Частичное представление вызывается на странице макета следующим образом:

 @RenderPage("~/views/shared/_usernavbar.cshtml")
  

На самом деле существует несколько родительских представлений с разными моделями представления, в каждом представлении я хочу вызвать частичное представление с данными в его модели представления. Я не могу просто добавить эти данные в модели родительского представления, потому что тогда модель, которую я вызывал бы в частичном представлении, должна была бы каждый раз отличаться.

Я вижу два возможных решения: использовать базовую модель представления, как указано выше, или вызывать частичную с помощью @Html.Экшен.

Комментарии:

1. Почему вы не используете @Html.Partial ? Также @Html. Действие не потребует дополнительного вызова сервера, они разрешаются до отправки представления клиенту.

2. В целом ваш вопрос не совсем ясен. Возможно, если вы создадите пример своей проблемы?

3. Насколько мне известно, я не могу использовать @Html.Partial для вызова частичного представления в другое представление, когда оба имеют разные ViewModel . Разве это не так?

4. Я попробую. Что касается @Html. Действие, под вызовом сервера я подразумеваю, что мне придется отправить второй запрос в БД. Если бы я просто использовал одну ViewModel как для частичного, так и для родительского представления, я бы отправлял только один запрос. Разве это неправильно?

5. Да, я знаю, это то, что я предложил в своем вопросе, одним из возможных решений является использование базовой модели представления и применение ее к макету. Мой вопрос был в том, почему это лучше, чем просто использовать Html. Действие для вызова частичного представления? Учитывая, что для обоих требуется отдельный запрос к БД для вызова данных, и если я использую Html. Действие Мне не нужно всегда иметь viewmodel в моем родительском представлении. Есть ли какие-либо преимущества в использовании базовой модели представления по сравнению с Html. Действие?

Ответ №1:

После прочтения комментариев

Как сказал Лиам, Partial — это предпочесть действие, потому что вы вызываете сервер один раз. Если вы вызываете действие, вы запускаете сервер дважды (2 запроса). При использовании partial контроллер запускается один раз.

Повторное нажатие может привести к увеличению использования памяти, большему количеству используемых подключений к БД, низкой пропускной способности запросов и, в целом, большему количеству используемых ресурсов сервера.

Используя ваш пример, если вам нужно получить UserInfoViewModel данные для каждой родительской модели, это может привести к тому, что ваше приложение выполнит N 1 запрос к базе данных (это может быть проблемой, если у вас больше «некоторых» пользователей или вы не используете кэш).

Более распространенным подходом может быть извлечение всех необходимых данных в контроллере с использованием только 1 или 2 запросов (один для Courses и один для всех необходимых UserInfo ) и агрегирование данных в контроллере.

Комментарии:

1. Спасибо за ваш ответ, но я не уверен, что вы пытаетесь сказать. Я не могу использовать @Html.Partial по уже указанной причине. Мне нужно было бы применить базовую модель представления, что означает отправку двух запросов в БД просто как Html. Действие было бы. HTML. Насколько я вижу, Action вернет частичное точно так же с тем же запросом к БД, что и при использовании базовой модели представления. Вы хотите сказать, что Html. Действие каким-то образом запрашивает БД по-другому, чем при использовании базовой модели представления? Если да, то каким образом?