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

426

我正在开发一个asp.net mvc 3的Web应用程序。我对它非常陌生。在使用Razor的视图中,我想声明一些局部变量并在整个页面中使用它们。该如何实现?

似乎很容易执行以下操作:

@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>
}

但是这个不起作用。这种情况可能吗?

7个回答

619

我认为你已经很接近了,试试这个:

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

1
你如何在VB.NET中实现这个? - Stefan Paul Noack
9
哦,我自己找到了:使用 @Code .. End Code 代替 @{ .. } - Stefan Paul Noack
2
@Abhijeet.Nagre,在问题中他写道:@bool isUserConnected = string.IsNullOrEmpty(Model.CreatorFullName); 但变量定义必须在一个“代码块”内。我无法给出更好的原因,这就是 razor 的工作方式。 - Tomas Jansson
4
@AbhijeetNagre - Razor通常非常擅长理解代码的起始和结束位置,但并不完美。有时候我们需要给它一点提示,告诉它应该被视为Razor/C#的内容以及哪些不是。如果你遇到Razor错误,添加{ }标记通常是第一步。 - Jon Story
1
在代码块(@for,@if等)的大括号{ }内,变量可以不使用“@”进行初始化。 - Flimtix
显示剩余2条评论

63

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

@{
    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中的情况。 - Matthew Walton
1
很好!您有什么想法,如何在页面下方再次使用变量 isUserConnected - SharpC
@SharpC 一旦你像那样声明一个变量,它就在该.cshtml文件的其余部分中可用。稍后在文件中,您可以执行类似于 @if (isUserConnected) { /* stuff if connected */ }<div>Connected? @isUserConnected</div>(这对字符串更有效)。但是它在文件外不可用(例如,在部分中必须单独声明它)。 - Dan Mangiarelli

18

您也可以使用:

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

代码中不需要变量。


10
这并未回答问题。 - Owen Pauling

18

这不是针对楼主问题的直接答案,但它可能也能帮助您。您可以在作用域中将某些HTML旁边声明一个本地变量而不会出现问题。

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

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

这应该是正确答案。与最新的Blazor兼容。 - Nick Chan Abdullah

15

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

@{
  int counter = 1;

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

4
如果您希望在整个页面上都可以访问某个变量,那么最好将其定义在文件的顶部。(您可以使用隐式或显式类型。)
@{
    // implicit type
    var something1 = "something";

    // explicit type
    string something2 = "something";
}

<div>@something1</div> @*display first variable*@
<div>@something2</div> @*display second variable*@

2
你可以把所有东西放在一个块中,然后在该块中轻松编写任何代码,就像下面的代码一样:
@{
        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>
        }
    }

它可以帮助您首先拥有更干净的代码,同时还可以防止您的页面多次加载不同的代码块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接