【问题标题】:mvc razor html not rendered in foreach loopmvc razor html 未在 foreach 循环中呈现
【发布时间】:2016-02-03 15:22:48
【问题描述】:

我有以下剃须刀代码:

 <div class="panel panel-default col-xs-10 col-sm-10 col-md-10 col-lg-10">
  <div class="panel-body">
    @if (Model != null)
    {
      var m = Model.Requests.FileData.OrderBy(p => p.FileName);
      if (m.Count() > 0)
      {
        foreach (var item in m)
        {
          if (Model.data.ToLower().Contains("dns"))
          {
            <div class="row">
              <span>
                @Html.DisplayFor(mi => item.FileName, new { @class = "form-label" })
                <span class="glyphicon glyphicon-trash"></span>
              </span>
            </div>
          }
        }
      }
    }
  </div>
</div>

这是一个显示数据库中已上传文件的面板。 选择文件后,控制器将其放入数据库,然后返回包含上述代码的部分视图。

当我调试应用程序并单步执行上述代码时,它会做它应该做的事情,但是当我查看渲染页面的 html 时,面板是空的。

渲染页面:

<div class="panel panel-default col-xs-10 col-sm-10 col-md-10 col-lg-10">
  <div class="panel-body">
  </div>
</div>

我在这里缺少什么,为什么没有呈现 html?

[编辑]

断点:

我发现只有第二个 IF 部分中的所有内容都不是渲染元素。

使用这个:

<span class="form-label">@item.FileName</span>

也不渲染任何东西。

[编辑]

将视图模型更改为具有名为 List FileData 的属性并将数据加载到其中。

然后将 Razor 更改为从中读取。

<div class="panel panel-default col-xs-10 col-sm-10 col-md-10 col-lg-10">
  <div class="panel-body">
    @if (Model != null && Model.FileData != null && Model.FileData.Any())
    {
      var m = Model.FileData.OrderBy(p => p.FileName);
      foreach (var item in m.ToList())
      {
        <div class="row">
          <span>
            <span class="form-label">@item.FileName</span>
            <span class="glyphicon glyphicon-trash"></span>
          </span>
        </div>
      }
    }
  </div>
</div>

很遗憾,仍然没有渲染。

【问题讨论】:

  • 这表明Model.Requests.FileData.OrderBy(p =&gt; p.FileName) 产生一个空集合或者Model.data.ToLower().Contains("dns")false。假设您已确保这些都没有发生?
  • 你能确认调试时第二个“if”语句中的断点被命中了吗?
  • 您为什么使用 DisplayFor?在跨度上设置类并在跨度内使用 item.FileName ...另外,一个好的编码标准是使用 if(m.Any()) 而不是 (m.Count() > 0)。
  • 我同意@spender 的评论。如果您实际上正在执行循环,我们至少会在呈现的 HTML 中看到静态 HTML(例如&lt;span class=glyphicon ...)。我想知道问题是否出在您的 if 声明上。您在item 中有一个集合成员,但if 语句正在检查Model.data。也许发布填充模型的控制器代码会有所帮助。附言在循环之前检查集合中是否有东西是完全没有必要的。如果它是空的,你将不会进入循环。删除m.Count() &gt; 0 检查。
  • ata.ToLower().Contains("dns") 是真还是假?

标签: c# html asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

在 action 方法中也尝试在查询中包含相关对象。考虑这个例子:

var model = db.MyModels
    .Include(m=>m.Requests.FileData)
    .FirstOrDefault(m=>m.ID==Id);

另外不要忘记添加 System.Data.Entity 命名空间。

【讨论】:

  • 我不确定你的意思。 Stepping 认为带有断点的剃须刀显示数据在那里。看图片。
  • 我知道。这是因为 EF 的延迟加载行为。当您附加调试器时,代理对象会在您观看它们时归档。
  • 我在 ViewModel 中创建了一个新属性并将 FileData 列表放入其中。然后我将剃须刀更改为使用此属性。但仍然没有渲染。
  • 如何将FileData 列表放入新属性中?
  • 正如我之前所说,当您观看对象项目时。您必须在查询中包含项目。搬到其他财产而不包括没有帮助。
【解决方案2】:

嗯,我发现了问题。 在我的 Jquery Ajax 代码中,我将 dataType 设置为“json”。 因为 Ajax 期待 json 作为回报,但得到了 HTML,然后这是一个错误,所以我的面板没有更新。 所以返回的数据对象的statusText是'OK',没有错误。

I found out what I did wrong here

我删除了 dataType 选项,现在一切正常。

感谢所有尝试提供帮助。

【讨论】:

  • 你的问题中哪里有提到使用 jquery 和 ajax!
  • 我之前没有提到它,因为调试器在视图中显示数据时让我偏离了轨道,所以我没有创建可能存在问题的链接。
  • 你应该删除这个问题 - 这对任何人都没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多