Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t访问Razor代码中内联声明的变量 @{ 使用(EFJugadorRepository=new EFJugadorRepository()) { var playersOnline=repository.FindAllJugadores().Where(j=>j.jugEstado==100.Count(); } 使用(EFEstadisticaMesaRepository estadisticaMesaRepository=new EFEstadisticaMesaRepository()) { var tablesInPlay=estadisticaMesaRepository.GetTablesInPlayCount; var availableTables=estadisticaMesaRepository.GetAvailableTablesCount; } }_C#_Asp.net Mvc 3_Variables_Razor - Fatal编程技术网

C# Can';t访问Razor代码中内联声明的变量 @{ 使用(EFJugadorRepository=new EFJugadorRepository()) { var playersOnline=repository.FindAllJugadores().Where(j=>j.jugEstado==100.Count(); } 使用(EFEstadisticaMesaRepository estadisticaMesaRepository=new EFEstadisticaMesaRepository()) { var tablesInPlay=estadisticaMesaRepository.GetTablesInPlayCount; var availableTables=estadisticaMesaRepository.GetAvailableTablesCount; } }

C# Can';t访问Razor代码中内联声明的变量 @{ 使用(EFJugadorRepository=new EFJugadorRepository()) { var playersOnline=repository.FindAllJugadores().Where(j=>j.jugEstado==100.Count(); } 使用(EFEstadisticaMesaRepository estadisticaMesaRepository=new EFEstadisticaMesaRepository()) { var tablesInPlay=estadisticaMesaRepository.GetTablesInPlayCount; var availableTables=estadisticaMesaRepository.GetAvailableTablesCount; } },c#,asp.net-mvc-3,variables,razor,C#,Asp.net Mvc 3,Variables,Razor,Jogadors Online:@playersOnline 梅萨斯约甘多:213 Mesas Disponiveis:850 @Html.Partial(“\u lognPartial”) 我试图在Razor代码中使用@playersOnline变量,但它说它没有声明 无法解析符号“PlayerOnline” 知道我为什么不能访问那个变量吗 是因为它是在语句中使用声明的吗?是的,是因为它是在语句中使用声明的 using语句中声明的所有内容都限定了该代码块的作用域。与if语句相同 只需将您的可

Jogadors Online:@playersOnline

梅萨斯约甘多:213

Mesas Disponiveis:850

@Html.Partial(“\u lognPartial”) 我试图在Razor代码中使用
@playersOnline
变量,但它说它没有声明

无法解析符号“PlayerOnline”

知道我为什么不能访问那个变量吗


是因为它是在
语句中使用
声明的吗?

是的,是因为它是在
语句中使用
声明的

using语句中声明的所有内容都限定了该代码块的作用域。与
if
语句相同

只需将您的可变偏差排除在使用范围之外:

<div id="header-content">
    <a href="@Url.Action("Index", "Home")">
        <img class="mainlogo" src="@Url.Content("~/Public/images/logo.png")"/>
    </a>

    @{
        using (EFJugadorRepository repository = new EFJugadorRepository())
        {
            var playersOnline = repository.FindAllJugadores().Where(j => j.jugEstado == 100).Count();
        }

        using (EFEstadisticaMesaRepository estadisticaMesaRepository = new EFEstadisticaMesaRepository())
        {
            var tablesInPlay = estadisticaMesaRepository.GetTablesInPlayCount;
            var availableTables = estadisticaMesaRepository.GetAvailableTablesCount;
        }
    }

    <div id="players">
        <p>Jogadores Online: <span class="onlinecount">@playersOnline</span></p>
        <p>Mesas Jogando: <span class="onlinecount">213</span></p>
        <p>Mesas Disponiveis: <span class="onlinecount">850</span></p>                    
    </div>

    <div id="login">
        @Html.Partial("_LogOnPartial")
    </div>
</div>
正如注释中指出的,您的代码似乎不属于视图层。思考一下你是如何构建代码的,并从Darin那里学习一些技巧

是因为它是在using语句中声明的吗

对。此变量在使用范围的
之外不可见

您可以这样做:

int playersOnline = 0;

    using (EFJugadorRepository repository = new EFJugadorRepository())
            {
                playersOnline = repository.[...]).Count();
            }

@使用(EFJugadorRepository=new EFJugadorRepository())
{
var playersOnline=repository.FindAllJugadores().Where(j=>j.jugEstado==100.Count();
Jogadors Online:@playersOnline

} 梅萨斯约甘多:213

Mesas Disponiveis:850


请参阅我对该问题的评论以了解更多上下文,这样我就不会重复我为什么要发布此答案

因此,我们首先声明一个视图模型:

<div id="players">
    @using (EFJugadorRepository repository = new EFJugadorRepository())
    {
        var playersOnline = repository.FindAllJugadores().Where(j => j.jugEstado == 100).Count();
        <p>Jogadores Online: <span class="onlinecount">@playersOnline</span></p>
    }
    <p>Mesas Jogando: <span class="onlinecount">213</span></p>
    <p>Mesas Disponiveis: <span class="onlinecount">850</span></p>                    
</div>
然后我们编写一个专用控制器:

public class PlayersStatsViewModel
{
    public int PlayersOnline { get; set; }
    public int TablesInPlay { get; set; }
    public int AvailableTables { get; set; }
}
接下来编写相应的局部视图(
~/Views/Players/Index.cshtml
):

@model PlayersStatsViewModel

Jogadors在线:
@DisplayFor(x=>x.PlayersOnline)

梅萨斯约甘多: @DisplayFor(x=>x.TablesInPlay)

Mesas Disponiveis: @DisplayFor(x=>x.AvailableTables)

最后一步是清理布局:

@model PlayersStatsViewModel
<div id="players">
    <p>
        Jogadores Online: 
        <span class="onlinecount">
            @Html.DisplayFor(x => x.PlayersOnline)
        </span>
    </p>
    <p>
        Mesas Jogando: 
        <span class="onlinecount">
            @Html.DisplayFor(x => x.TablesInPlay)
        </span>
    </p>
    <p>
        Mesas Disponiveis: 
        <span class="onlinecount">
            @Html.DisplayFor(x => x.AvailableTables)
        </span>
    </p>
</div>

@动作(“索引”,“玩家”)
@Html.Partial(“\u lognPartial”)

不要忽略我在索引控制器操作中留下的两个TODO。它们很重要。现在,您的控制器与您访问数据的方式紧密耦合(似乎是EF之类的)。应用程序中的层应尽可能紧密耦合。为了实现这一点,您应该使用抽象。您应该将数据访问层抽象到接口后面。然后让控制器将这些存储库接口作为构造函数参数。最后,您只需配置您的DI框架以服务于正确的实现(例如EF或其他任何形式)。

在您的VEWS中编写这段代码有什么特别的原因吗?我所说的代码类型是指通常属于数据访问层而不是视图的代码。或者更准确地说,在您的例子中,是那种试图完成视图模型在ASP.NET MVC中应该完成的任务的代码。我真的不敢相信人们仅仅因为不使用视图模型就做了什么。那太可怕了。看起来像PHP(出错时)或经典ASP。我真的建议您在进一步使用ASP.NET MVC之前花点时间阅读一下视图模型。@DarinDimitrov:这在_layout.cshtml文件中。如何在不重复自己的情况下访问这些信息?非常简单:在ASP.NET MVC中,您总是从编写表示这些数据的视图模型开始。然后编写一个控制器操作,该操作将查询DAL并获取域模型。然后,它将这些域模型映射回视图模型。然后将此视图模型传递给相应的局部视图。现在,布局中剩下的就是调用这个子操作,比如
@Html.action(“FooAction”,“Bar”)
。因此,您基本上可以通过调用Html.Action助手来替换视图中显示的内容。你想让我给你举个例子,还是你会明白的?@DarinDimitrov:你最好举个例子。:)在此期间,我将开始阅读有关Html.Action的内容。我确实总是在常规操作中使用ViewModels,但由于这是在_布局中,而且我不了解Html.Action helper,所以我想到了这个解决方案。老实说,我现在已经尝试在三个项目中使用DI,但我现在看不到它能带来什么好处。我理解它的作用以及它为什么有用,但由于我没有使用单元测试(没有时间考虑我的工作日程),而且后端有99.999%的机会不会改变,DI不会为我做任何事情,而是让事情变得不必要的复杂。感谢这个例子,但我似乎无法从Html中找到官方文档。部分,MSDN结果是空的。在哪里可以找到MVC3的官方文档?@SergioTapia,你的意思是
Html.Action
?菲尔·哈克(Phil Haack)为此写了一篇很好的博客文章:就官方文件而言,这里有:
@model PlayersStatsViewModel
<div id="players">
    <p>
        Jogadores Online: 
        <span class="onlinecount">
            @Html.DisplayFor(x => x.PlayersOnline)
        </span>
    </p>
    <p>
        Mesas Jogando: 
        <span class="onlinecount">
            @Html.DisplayFor(x => x.TablesInPlay)
        </span>
    </p>
    <p>
        Mesas Disponiveis: 
        <span class="onlinecount">
            @Html.DisplayFor(x => x.AvailableTables)
        </span>
    </p>
</div>
<div id="header-content">
    <a href="@Url.Action("Index", "Home")">
        <img class="mainlogo" src="@Url.Content("~/Public/images/logo.png")"/>
    </a>

    @Html.Action("Index", "Players")

    <div id="login">
        @Html.Partial("_LogOnPartial")
    </div>
</div>