【问题标题】:How to correctly access the ViewModel properties for a condition in a .cshtml如何正确访问 .cshtml 中条件的 ViewModel 属性
【发布时间】:2020-01-29 17:27:05
【问题描述】:

我正在尝试在 kendo UI 网格中应用“过滤器”,如果 ViewModel 的属性为 true,则显示带有链接地址的单元格的值,如果为 false,则仅显示不带地址的值。此网格的 viewModel 有一个名为 IsRecorded 的属性,它用作前面解释的过滤器。

但由于某种原因,当我运行项目并进入剑道网格所在的模块时,我不断收到以下错误:

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" });
          };

我在 if 条件下使用 Model 类访问它是否错误?奇怪的部分是在使用模型时。它向我展示了 viewmodel 具有的所有属性,就像它正确访问它但它返回 null 一样。 条件实现也对吗?

感谢您的回答。

【问题讨论】:

    标签: .net asp.net-mvc kendo-ui kendo-grid asp.net-mvc-viewmodel


    【解决方案1】:

    Model.IsRecorded 将查看页面模型,而不是网格模型 (PersonReportViewModel)。 here 显示了实现这一目标的几种方法。我会使用 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");
    

    如果您遇到诸如缺少#{ 之类的错误,则会出现控制台错误。

    【讨论】:

    • 非常感谢!这实际上有帮助。如果您或任何人有时间,您能以更简单的方式向我解释这里发生了什么吗? Template() 中的 { } 是 ClientTemplate() 参数上的表达式吗?这种方法可以一起使用吗?如果没有类/模型实例,如何在 if 条件下访问 IsRecorded 属性? # { 指令的确切含义是什么?它们的用途是什么?很抱歉所有这些突然的问题,但我对所有这些 ASP MVC、Razor 和 Kendo ui 东西都很陌生,我真的很想学习和理解它。
    • 是的,Kendo 和 MVC Razor 一样有学习曲线。请记住,这一切都归结为 html 和 javascript。最初我花了很多时间查看控件和 javascript 剑道渲染。所以 kendo 有一个 Template 呈现服务器端或 ClientTemplate 呈现客户端。我认为您不再需要空模板,但旧版本在 ClientTemplate 之前需要它。在客户端模板中,您可以在哈希 (#) 之间或在 javascript 中访问当前模型,如上面的链接中所述。
    • .Template(t =&gt; {}) - 这只是意味着不要使用服务器模板。过去需要使用 ClientTemplate。
    • 很好,感谢您的解释,提供的链接很棒,因为它有很多场景。所以基本上你可以在一句代码中拥有两种不同的视图,一种用于服务器端,一种用于客户端。这行呢:@"#=JobId#" 是在 JS 代码语句的中间开始一个 Razor 语句的指令吗?那么 #=JobId# 中的 = 呢?从你所说的你在 中创建一个 JS 句子,你是否使用 = 访问 JobId 的模型值?
    • @ 是 verbatim prefix。然后我们告诉 kendo 将模型字段 JobId 插入到 span 元素中。你必须小心某些结构,因为你有剑道在做它的解释以及对 html 的剃刀。在某些嵌套场景中,您必须告诉 Kendo 将模板转换为 HTML:.ToClientTemplate().ToHtmlString().
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多