【问题标题】:The foreach block is missing a closing "}" characterforeach 块缺少结束“}”字符
【发布时间】:2012-03-12 11:47:03
【问题描述】:

我今天玩 Razor 很开心!你能看出这个视图有什么问题并解释它为什么会出错吗?

@foreach (var item in Model){

if (item.ID != PreviousOrderId){
    <div class="orderdetail">
        <div class="customer">
            <p class="strong">OrderID:</p> 
            <p>@item.ID</p>
            <p class="strong">Order Date:</p>
            <p>@String.Format("{0:g}", TimeZoneInfo.ConvertTime(item.DateInitialised, TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")))</p>
            <p class="strong">Customer Name:</p> 
            <p>@item.WebsiteUser.Name</p>
            <p class="strong">Practice Name:</p>
            <p>@item.WebsiteUser.PracticeName</p>
            <p class="strong">Customer E-Mail:</p> 
            <p>@item.WebsiteUser.EMailAddress</p>
        </div>
   }



    <div class="detail">
        <span class="strong">Licence Key:</span><span>@item.Licence.LicenceKey</span>
        <span class="strong">Serial No:</span><span>@item.Licence.SerialNumber</span>
    </div>               

   @if (item.ID != PreviousOrderId && PreviousOrderId != 0){
    </div>
    <div class="clear"></div>
   }        

PreviousOrderId = item.ID;
}

【问题讨论】:

  • 我的猜测是在 foreach 块末尾缺少 } 字符。逐字粘贴整个文件和整个错误消息,以便我们可以看到行号。
  • 也许您可以观看语法着色而不是在这里发布series
  • @HenkHolterman 我正在尝试。除非我被卡住了,否则我不会在这里发帖
  • 我认为 van Hooijdonk 有这个道理; razor 需要一个逻辑树;当您将 div 分成几块时,您已经破坏了它。
  • @Jon 非常具体;第一个块包含不平衡的&lt;div&gt; - 最后一个块包含不平衡的&lt;/div&gt;

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


【解决方案1】:

您已将&lt;div class="orderdetail"&gt; 分成两部分。开始标签在第一个 if 块中,结束标签在第二个 if 块中。

我认为这让 Razor 感到困惑。

尝试在一个 if 块中打开和关闭您的 div

【讨论】:

  • 这正是正在发生的事情。 razor 编辑器看不到结束的
    ,因此它无法从第一个 if 块中找到 }。然后出于同样的原因,它无法从 foreach 块中看到关闭的 }。如果这只是一个编辑器问题并且视图运行良好,我不会感到惊讶。
  • @Falanwe 不幸的是,它抛出了一个带有解析器错误的 YSOD。我认为它也应该是编辑端的
  • @Falanwe Parser 错误描述:解析服务此请求所需的资源时出错。请查看以下特定的解析错误详细信息并适当地修改您的源文件。解析器错误消息:foreach 块缺少结束“}”字符。确保此块中的所有“{”字符都有一个匹配的“}”字符,并且没有任何“}”字符被解释为标记。
  • @Jon 你试过我的解决方案了吗?我想它会解决你的问题。
  • @vanHooijdonk 我明白为什么会这样,但它不能解决我正在努力实现的问题
  • 【解决方案2】:

    如果你已经在一个代码块中,你就不需要@-prefix 代码构造了……你的代码块以@foreach 开头。

    @foreach (var x in new string[] { "x", "y" ])
    {
        if (userGuid != ViewBag.x)
       {
        @:<div class="orderdetail">
        <div class="customer">
            <p class="strong">OrderID:</p> 
            <p>@item.ID</p>
            <p class="strong">Order Date:</p>
            <p>@String.Format("{0:g}", TimeZoneInfo.ConvertTime(item.DateInitialised</p>
            <p class="strong">Customer Name:</p> 
            <p>@item.WebsiteUser.Name</p>
            <p class="strong">Practice Name:</p>
            <p>@item.WebsiteUser.PracticeName</p>
            <p class="strong">Customer E-Mail:</p> 
            <p>@item.WebsiteUser.EMailAddress</p>
        </div>
        }
        <div class="detail">
            <span class="strong">Licence Key:</span><span>@item.Licence.LicenceKey</span>
            <span class="strong">Serial No:</span><span>@item.Licence.SerialNumber</span>
        </div>               
    
    if (userGuid != ViewBag.x && ViewBag.x != 0)
    {
        @:</div>
        <div class="clear"></div>
    }      
    PreviousOrderId = item.ID;    
    }
    

    【讨论】:

    • 这行不通,因为它会认为 if 语句是 HTML 标记
    • 你是对的,我的错。我没有考虑关闭 div。
    • 我用一个可能的解决方案编辑了我的帖子,我认为这应该可以让 razor 知道哪些 div 标签属于一起。
    • 你也可以把开始和结束的div放在@Html.Raw("&lt;div class=\"orderdetail\"&gt;")and @Html.Raw("&lt;/div&gt;")
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2013-12-02
    • 2021-05-03
    • 2016-05-28
    • 2013-11-10
    • 2018-08-13
    • 2021-08-28
    • 2016-11-25
    相关资源
    最近更新 更多