4

我只是在使用 razor 语法深入研究 .NET 视图。我的大部分编码知识都在 javascript 中,所以这可能是一个基本问题(或者我的方法完全错误!)。在我的 html 中,我正在构建基于模板顶部声明的数组的 dns 预取标签。也许由于我的 javascript 背景,我正在接近这个错误,但如果我的一个视图不需要任何预取标签,我想避免声明 DNSPrefetch 变量。

如何测试变量是否存在,然后根据结果执行一些代码?我使用 try/catch 让它工作,但我认为有更好的方法。谢谢!

在 _Layout 中(使用 try/catch):

  @{
    try {
      foreach (var dns in ViewBag.DNSPrefetch) {
        <link rel="dns-prefetch" href="//@dns" />
      }
    }
    catch{}
  }

在模板中:

  @{
    Layout = "~/Views/Shared/_Layout.cshtml";

    // DNS prefetching for improved performance. More reading: http://html5boilerplate.com/docs/DNS-Prefetching/
    string[] DNSArray = { "ajax.googleapis.com", "mpsnare.iesnare.com" };
    ViewBag.DNSPrefetch = DNSArray;
}
4

2 回答 2

9

您可以检查该值是否为空:

@{
  if (ViewBag.DNSPrefetch != null) {
    foreach (var dns in ViewBag.DNSPrefetch) {
      <link rel="dns-prefetch" href="//@dns" />
    }
  }
}

(或者,您可以在不需要时将 DNSArray 声明为空数组,然后您可以在所有情况下按原样使用foreach块。)

于 2012-08-20T18:41:17.110 回答
2

该错误是因为 null 不提供迭代器,因此当 foreach 开始时会引发异常。首先使用条件检查值是否在视图包中。

@{
 if( ViewBag.DNSPrefect != null ){
  foreach (var dns in ViewBag.DNSPrefetch) {
    <link rel="dns-prefetch" href="//@dns" />
  }
 }
}

但是,这应该在您的视图模型中完成。使用强类型视图模型来完成此操作。您将在控制器操作中组合视图模型,然后将视图模型传递到视图中,该视图将被强类型化到该视图模型。这将允许您在 a 上使用 foreach 循环,string[]而不必担心它是否为空,因为如果不添加任何内容,则该值已经被初始化为空。

查看模型SomeActionVM.cs

public class SomeActionVM
{
 public string[] DNSArray { get; set; }
 //other variables to pass in
}  

行动:

// Get: SomeAction
[HttpGet]
public ActionResult SomeAction()
{
 var vm = new SomeActionVM();
 vm.DNSArray = { "ajax.googleapis.com", "mpsnare.iesnare.com" };
 return View(vm);
}

看法:

@model namespace.SomeActionVM

@foreach (var dns in Model.DNSPrefetch) {
    @:<link rel="dns-prefetch" href="//@dns" />
}
于 2012-08-20T18:41:27.920 回答