我只是用剃刀语法深入研究.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;
}
答案 0 :(得分:8)
您可以检查该值是否为空:
@{
if (ViewBag.DNSPrefetch != null) {
foreach (var dns in ViewBag.DNSPrefetch) {
<link rel="dns-prefetch" href="//@dns" />
}
}
}
(或者,您可以在不需要DNSArray时将其声明为空数组,然后您可以按原样使用 foreach 块。)
答案 1 :(得分:2)
错误是因为null不提供迭代器,因此当foreach开始时它会抛出异常。使用条件来检查值是否首先在viewbag中。
@{
if( ViewBag.DNSPrefect != null ){
foreach (var dns in ViewBag.DNSPrefetch) {
<link rel="dns-prefetch" href="//@dns" />
}
}
}
但是,应在视图模型中完成。使用强类型视图模型来完成此任务。您可以在控制器操作中组合视图模型,然后将视图模型传递到视图中,该视图将强烈键入该视图模型。这将允许您在string[]
上使用foreach循环而不必担心它是否为null,因为如果没有添加任何内容,该值将已初始化为空。
查看模型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" />
}