4

かみそりの構文で.NETビューを掘り下げています。私のコーディング知識のほとんどはjavascriptにあるので、これはおそらく基本的な質問です(または私のアプローチは完全に間違っています!)。私のHTMLでは、テンプレートの上部で宣言された配列に基づいてDNSプリフェッチタグを作成しています。JavaScriptのバックグラウンドが原因でこれに近づいているのかもしれませんが、ビューの1つにプリフェッチタグが必要ない場合は、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

値がnullかどうかを確認できます。

@{
  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" />
  }
 }
}

ただし、これはビューモデルで実行する必要があります。これを実現するには、強く型付けされたビューモデルを使用します。コントローラアクションでビューモデルを作成してから、そのビューモデルに強く型付けされるビューにビューモデルを渡します。string[]これにより、何も追加されていない場合、値はすでに空として初期化されているため、nullであるかどうかを気にせずにforeachループを使用できます。

モデルを見る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 に答える