如何在Razor中声明局部变量?


354

我正在asp.net mvc 3中开发一个Web应用程序。在使用剃刀的视图中,我想声明一些局部变量并在整个页面中使用它。如何才能做到这一点?

能够执行以下操作似乎很琐碎:

@bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);
@if (isUserConnected)
{ // meaning that the viewing user has not been saved
    <div>
        <div> click to join us </div>
        <a id="login" href="javascript:void(0);" style="display: inline; ">join</a>
    </div>
}

但这是行不通的。这可能吗?

Answers:


521

我认为您非常接近,请尝试以下操作:

@{bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);}
@if (isUserConnected)
{ // meaning that the viewing user has not been saved so continue
    <div>
        <div> click to join us </div>
        <a id="login" href="javascript:void(0);" style="display: inline; ">join here</a>
    </div>
}

噢,该死,我正在尝试所有可能的解决方法。谢谢托马斯!
vondip 2011年

您如何在VB.NET中做到这一点?
Stefan Paul Noack,2012年

7
哦,我自己发现了它:@Code .. End Code而不是@{ .. }
Stefan Paul Noack

1
@ Abhijeet.Nagre,在他写的问题中:@bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);但是变量定义必须在“代码块”中。我不能给出一个更好的答案,为什么这就是剃刀的工作原理。
Tomas Jansson

2
@AbhijeetNagre-Razor 通常非常擅长理解代码的开始和结束位置,但是它并不完美。有时我们只需要给它一些提示,说明应该将哪些内容视为Razor / C#,哪些则不应。如果您遇到Razor错误,{ }则通常是添加标签的第一步
Jon Story

50

我认为变量应该在同一块中:

@{bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);
    if (isUserConnected)
    { // meaning that the viewing user has not been saved
        <div>
            <div> click to join us </div>
            <a id="login" href="javascript:void(0);" style="display: inline; ">join</a>
        </div>
    }
    }

至少在MVC3中似乎是如此。
马修·沃尔顿

1
优秀的!您知道如何isUserConnected在页面的下方再次使用该变量吗?
SharpC 2015年

@SharpC一旦声明了类似的变量,该变量即可在该.cshtml文件的其余部分中使用。在文件的后面,您可以执行类似@if (isUserConnected) { /* stuff if connected */ }或的操作<div>Connected? @isUserConnected</div>(这对于字符串更有效)。但是在该文件之外不可用(例如,您必须在局部文件中分别声明它)。
Dan Mangiarelli,2015年

18

您还可以使用:

@if(string.IsNullOrEmpty(Model.CreatorFullName))
{
...your code...
}

代码中不需要变量


6
这不能为问题提供答案。
Owen Pauling

13

如果您正在寻找一个int变量,该变量会随着代码循环而递增,则可以使用如下代码:

@{
  int counter = 1;

  foreach (var item in Model.Stuff) {
    ... some code ...
    counter = counter + 1;
  }
} 

12

不是直接解决OP问题的方法,但它也可能对您有所帮助。您可以在范围内的某些html旁边声明局部变量,而不会遇到麻烦。

@foreach (var item in Model.Stuff)
{
    var file = item.MoreStuff.FirstOrDefault();

    <li><a href="@item.Source">@file.Name</a></li>
}

这就是我一直在寻找的谢谢你!!
Ninjanoel

2

声明要在页面上访问的var。通常在页面顶部工作。隐式或显式地选择。

          @{
               //implicit
               var something1 = "something";
               //explicit
               string something2 = "something";
          }


            @something1 //to display on the page
            @something2 //to display on the page

1

您可以将所有内容放在一个块中,然后只需在下面的代码中轻松编写所需的任何代码:

@{
        bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName);
        if (isUserConnected)
        { // meaning that the viewing user has not been saved
            <div>
                <div> click to join us </div>
                <a id="login" href="javascript:void(0);" style="display: inline; ">join</a>
            </div>
        }
    }

它可以帮助您起初拥有更清晰的代码,还可以防止页面多次加载不同的代码块

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.