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; } }
Jogadors Online:@playersOnline 梅萨斯约甘多:213 Mesas Disponiveis:850 @Html.Partial(“\u lognPartial”) 我试图在Razor代码中使用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语句相同 只需将您的可
@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>