【问题标题】:What is the scope of variables in Razor MVC 3Razor MVC 3中变量的范围是什么
【发布时间】:2013-04-11 12:55:27
【问题描述】:

我的 Razor 代码中 myClient 的变量范围存在问题。我确信解决方案很简单。基本上我在单独的 @{} 块中引用它,这可能是导致问题的原因,但似乎除非我这样做,否则我会在 HTML 中获得 if..{} 代码。

@{
int i = 0;
foreach (var item in Model.Clients)
    {
        Int32 myId = Convert.ToInt32(item.DBID);
        var myClient = db.Client.Where(c => c.Id == myId).First();
    <td>
        <table class="inner">
        <tr><th>
            @string.Format(
                "{0} {1} {2}",
                myClient.Title,
                myClient.Initials,
                myClient.LastName)

                @{
                    if (myClient.Type!="Primary")
                    {
                        @Html.ActionLink(
                            "Delete", 
                            "Delete", 
                            "ClientBackground", 
                            new { id=item.ID }, null)
                    }
                 }
            </th></tr>
        }
        <table>

我的代码无法引用myClient.Type。如果我删除周围的@{},那么我会在 HTML 中获得 c# 代码。

我知道一些简单的事情,但我没有看到它。

非常感谢任何帮助。

编辑:表已关闭。

【问题讨论】:

  • 请发布您的整个代码块。其中&lt;td&gt;&lt;table&gt; 已关闭
  • 嗨,我最初没有把它放进去,因为我认为我不需要它来解决问题。无论如何,我现在有,请参阅编辑。再次感谢。

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

试试这个:

<table class="inner">
              @{int i = 0;}

              @foreach (var item in Model.Clients)
                  {
                      Int32 myId = Convert.ToInt32(item.DBID);
                      var myClient = db.Client.Where(c => c.Id == myId).First();


                            <tr><td>@string.Format("{0} {1} {2}",myClient.Title,myClient.Initials,myClient.LastName)
                                    @if (myClient.Type!="Primary")
                                        {
                                        @Html.ActionLink("Delete", "Delete","ClientBackground", new { id=item.ID },null)
                                }

                    </td></tr>
              }

</table>

我对格式做了很多猜测。重要的是,我将您的 int 分配放入它自己的块中。我将打开和关闭&lt;tr&gt;&lt;td&gt; 放在匹配并将它们放在可选@if blocks 之外。但是这个版本会编译。

【讨论】:

  • 谢谢,这行得通。出于兴趣,@{} 和 @ 之间有什么区别。我的怀疑是前者打包了多行代码。我假设可以从 @{} 包中访问变量。我想我发现我的问题出在变量范围之外。
  • @SamJolly 你有正确的想法。单个语句或多行。我认为您的问题是更多的嵌套大括号和表格标签。嵌套层次要清晰。
【解决方案2】:

这里有奇怪的语法:

@{if (myClient.Type!="Primary")
     {
          @Html.ActionLink("Delete", "Delete","ClientBackground", new { id=item.ID },null)
     }
 }

为什么不:

@if (myClient.Type!="Primary")
{
   @Html.ActionLink("Delete", "Delete","ClientBackground", new { id=item.ID },null)
}

添加:

您更新的代码包含无效的 html 标记,它应该类似于:

<table class="inner">
@{
int i = 0;
foreach (var item in Model.Clients)
{
    Int32 myId = Convert.ToInt32(item.DBID);
    var myClient = db.Client.Where(c => c.Id == myId).First();
    <tr><th>
        @string.Format("{0} {1} {2}", myClient.Title, myClient.Initials, myClient.LastName)
        @if (myClient.Type!="Primary")
        {
            @Html.ActionLink("Delete", "Delete", "ClientBackground", new { id=item.ID }, null)
        }
    </th></tr>
}
</table>

表没有关闭,你已经打开了&lt;td&gt;标签

【讨论】:

  • 感谢您的建议。可能是“错误”而不是“奇怪”的语法:)。请参阅下面关于 @{} 与 @ 的问题。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多