Как правильно получить доступ к свойствам ViewModel для условия в .cshtml

Я пытаюсь применить «фильтр» в сетке пользовательского интерфейса кендо, в котором, если свойство ViewModel истинно, тогда покажите значение ячейки с адресом ссылки, если ложно, просто покажите значение без адреса. ViewModel для эта сетка имеет свойство IsRecorded, которое используется в качестве фильтра для ранее объясненного.

Но по какой-то причине я продолжаю получать следующую ошибку, когда запускаю проект и вхожу в модуль, где находится Kendo Grid:

System.NullReferenceException: «Ссылка на объект не указывает на экземпляр объекта».

System.Web.Mvc.WebViewPage.Model.get вернул значение null.

А это мое кендо .cshtml

 @(Html.Kendo().Grid<PersonReportViewModel>()
      .Name("Report")
      .Columns(columns =>
      {
          columns.Bound(m => m.Name)
              .HeaderHtmlAttributes(new { @class = "Name" }).HtmlAttributes(new { @class = "Name" });

          if (Model.IsRecorded)
          {
              columns.Bound(m => m.Id)
                  .HeaderHtmlAttributes(new { @class = "Id" }).HtmlAttributes(new { @class = "Id" })
                  .ClientTemplate("<a href=\"SomeAdress"</a>");
          }
          else
          {
              columns.Bound(m => m.Id)
                  .HeaderHtmlAttributes(new { @class = "Id" }).HtmlAttributes(new { @class = "Id" });
          };

Я неправильно обращаюсь к классу Model в условии if? Странная часть заключается в том, что при использовании Model. он показывает мне все свойства, которые имеет модель представления, как будто она правильно обращается к ней, но возвращает значение null. Верна ли вообще реализация условия?

Спасибо за ваши ответы.


person Retrosec6    schedule 29.01.2020    source источник


Ответы (1)


Model.IsRecorded будет рассматривать модель страницы, а не модель сетки (PersonReportViewModel). Показаны несколько способов достижения этого здесь. Я бы использовал ClientTemplate:

columns.Template(t => {}).ClientTemplate(
    "# if (IsRecorded) {#"
  + "<a href=\'SomeAdress'</a>"
  + "# } else { #"
  + @"<span>#=JobId#</span>"
  + "# } #")
.HeaderHtmlAttributes(new { @class = "Id" })
.HtmlAttributes(new { @class = "Id" })
.Title("Job Id");

Ошибка консоли произойдет, если у вас есть такие ошибки, как отсутствие # или {.

person Steve Greene    schedule 29.01.2020
comment
Большое спасибо! Это действительно помогло. Если у вас или у кого-то есть немного времени, не могли бы вы объяснить мне, что здесь происходит, более простым способом? является ли {} в Template() выражением, которое находится в аргументе ClientTemplate()? эти методы работают вместе? как получить доступ к свойству IsRecorded в условии if без экземпляра класса/модели? и что именно означают директивы # { и для чего они используются? Извините за все эти внезапные вопросы, но я новичок во всех этих ASP MVC, Razor и Kendo ui, и я действительно хочу изучить и понять это. - person Retrosec6; 29.01.2020
comment
Да, у кендо есть кривая обучения, как и у MVC Razor. Просто имейте в виду, что все сводится к html и javascript. Сначала я потратил много времени на просмотр элементов управления и рендеринга javascript-кендо. Таким образом, кендо имеет Template, отображаемый на стороне сервера, или клиентскую часть, отображаемую в ClientTemplate. Я думаю, вам больше не нужен пустой шаблон, но в более старых версиях он требовался до ClientTemplate. Внутри клиентского шаблона вы можете получить доступ к своей текущей модели либо между хэшами (#), либо в javascript, как описано в ссылке выше. - person Steve Greene; 29.01.2020
comment
.Template(t => {}) - это просто означает не использовать шаблон сервера. Раньше требовалось использовать ClientTemplate. - person Steve Greene; 29.01.2020
comment
Хорошо, спасибо за объяснение, ссылка предоставлена, это здорово, так как в ней много сценариев. Таким образом, вы можете иметь два разных представления всего в одном предложении кода, одно для серверной части и одно для клиентской части. Как насчет этой строки: @‹span›#=JobId#‹/span› Является ли @ директивой для запуска предложения Razor в середине предложения кода JS? А как насчет = в #=JobId# ? из того, что вы сказали, что создаете предложение JS внутри ‹span›, вы получаете доступ к значению модели JobId с помощью =? - person Retrosec6; 30.01.2020
comment
@ — это дословный префикс. Затем мы говорим кендо вставить поле модели JobId внутрь элемента span. Вы должны быть осторожны с определенными конструкциями, потому что у вас есть кендо, выполняющее их интерпретацию, а также бритва для html. Есть несколько сценариев вложенности, когда вы должны указать Кендо преобразовать шаблон в HTML: .ToClientTemplate().ToHtmlString(). - person Steve Greene; 30.01.2020