C# 有没有办法在cshtml中更改变量的范围?

C# 有没有办法在cshtml中更改变量的范围?,c#,asp.net-core,C#,Asp.net Core,当我创建一个动态页面时,我尝试访问由foreach循环修改的两个变量。即使我在外部声明了变量,循环结束后变量也会变为未赋值 我知道我应该找到一种创建sql连接的方法,但是每当我尝试在循环之前访问变量时,这个问题就会不断发生。我寻找了一种方法来阻止垃圾收集器完全删除变量,但我需要一种更干净的方法来完成这项工作 @foreach(db.Horraire中的变量项) { 字符串雇员; 字符串颜色; foreach(数据库中的var搜索) { 如果(search.id==item.EmployeID){

当我创建一个动态页面时,我尝试访问由foreach循环修改的两个变量。即使我在外部声明了变量,循环结束后变量也会变为未赋值

我知道我应该找到一种创建sql连接的方法,但是每当我尝试在循环之前访问变量时,这个问题就会不断发生。我寻找了一种方法来阻止垃圾收集器完全删除变量,但我需要一种更干净的方法来完成这项工作

@foreach(db.Horraire中的变量项)
{
字符串雇员;
字符串颜色;
foreach(数据库中的var搜索)
{
如果(search.id==item.EmployeID){Employe=search.naming;break;}
}
foreach(db.T–che中的var搜索)
{
如果(search.id==item.EmployeID){color=search.coloring;break;}
}
//将工作时间转换成日历上被占用的红场大小,它工作正常
TimeSpan减法=item.fin.Subtract(item.début);
浮点数=减去小时数*70;浮点数=浮点数+减去分钟数*(60/70);
字符串pheight=“”+phours+“px”;
float thours=item.début.Subtract(new DateTime()).Hours+item.début.Subtract(new DateTime()).Minutes/60-8;thours=thours*70+110;
字符串theight=“”+thours+“px”;
int lday=项目日*200+200;
字符串ljour=“”+lday+“px”;
//缺少局部变量
@Employe//缺少局部变量
}

这两个变量都变成了错误“使用未分配的局部变量”,而不仅仅是将变量注入html。如何修复关节、变量范围或垃圾收集?

感谢您的回答和对LINQ语言的指导,我根本不知道这些。下面是避免范围混乱的新行

@db.Tache.FirstOrDefault(x=>x.id==item.EmployeID);
@db.Employe.FirstOrDefault(x=>x.id==item.EmployeID);

谢谢你的回答和我不知道的LINQ语言的方向。下面是避免范围混乱的新行

@db.Tache.FirstOrDefault(x=>x.id==item.EmployeID);
@db.Employe.FirstOrDefault(x=>x.id==item.EmployeID);

这与“垃圾收集器完全删除变量”无关,也与变量的范围无关

虽然您可以确定
foreach()
肯定会分配变量,但C#编译器不会。这是理所当然的

因此,您需要明确地为它们指定一个合理的默认值:

String Employe = "";
String color = "";
但是你的代码还有很多问题。您的答案中的修正:

@db.Tache.FirstOrDefault(x => x.id == item.EmployeID).coloring;
@db.Employe.FirstOrDefault(x => x.id == item.EmployeID).naming;
FirstOrDefault()
返回
null
时,将抛出
NullReferenceException
。因此,您必须添加一个空检查,或者只需调用
First()
。当数据库中没有匹配的记录时,将抛出

解决方案实际上是在查询时加入表:

@foreach (var item in db.Horraire.Include(h => h.Employé).Include(h => h.Tâche))
{
    // ...

    <div style="color: @item.Tâche.coloring">@item.Employé.naming</div>
}
@foreach(db.Horraire.Include(h=>h.Employé).Include(h=>h.Téche)中的变量项)
{
// ...
@项目名称
}

但是您确实不应该在视图中运行查询,您应该在控制器中运行查询并填充视图模型。

这与“垃圾收集器完全删除变量”无关,也与变量的范围无关

虽然您可以确定
foreach()
肯定会分配变量,但C#编译器不会。这是理所当然的

因此,您需要明确地为它们指定一个合理的默认值:

String Employe = "";
String color = "";
但是你的代码还有很多问题。您的答案中的修正:

@db.Tache.FirstOrDefault(x => x.id == item.EmployeID).coloring;
@db.Employe.FirstOrDefault(x => x.id == item.EmployeID).naming;
FirstOrDefault()
返回
null
时,将抛出
NullReferenceException
。因此,您必须添加一个空检查,或者只需调用
First()
。当数据库中没有匹配的记录时,将抛出

解决方案实际上是在查询时加入表:

@foreach (var item in db.Horraire.Include(h => h.Employé).Include(h => h.Tâche))
{
    // ...

    <div style="color: @item.Tâche.coloring">@item.Employé.naming</div>
}
@foreach(db.Horraire.Include(h=>h.Employé).Include(h=>h.Téche)中的变量项)
{
// ...
@项目名称
}

但是您确实不应该在视图中运行查询,您应该在控制器中执行此操作并填充视图模型。

如果未验证循环中的条件,则永远不会分配变量。因此,在这种情况下,要么分配一个值,要么使用LINQ:
db.employee.FirstOrDefault(x=>x.id==item.EmployeID)
您应该过滤
db.employee.Where(search=>search.id==item.EmployeID)
而不是遍历所有的db记录!如果未验证循环内的条件,则永远不会分配变量。因此,在这种情况下,要么分配一个值,要么使用LINQ:
db.employee.FirstOrDefault(x=>x.id==item.EmployeID)
您应该过滤
db.employee.Where(search=>search.id==item.EmployeID)
而不是遍历所有的db记录!