2014-03-06 53 views
2

我的代碼有一些格式問題,其中我正在循環對象的集合,並嘗試生成嵌套的DIV容器。我相信,在Razor引擎嘗試將我動態發佈的CLOSING div標籤與開放標籤進行匹配時,出現了這種複雜性。有人可以幫助我確定下面的代碼中預期的行爲是什麼,這些代碼模仿我自己的行爲,但爲了演示的目的,它大大簡化了。在MVC Razor中使用條件邏輯來創建動態DIV標籤。標籤不匹配

在這個例子中,我想要一個帶有邊界的大外部DIV,其中包含3個不同大小的小型DIV(爲了識別)。我發生的事情是我打的第一個CLOSING DIV標籤(在循環中;最後)被應用到OUTER DIV,但我希望它應用於循環內的LARGE DIV標籤。我希望將我的FINAL DIV標記(循環外部)應用於大OUTER DIV標記。

結果是,我的3個INNER DIV標籤是在OUTER DIV標籤之外創建的,並沒有嵌套在它的內部。

我只想知道Razor如何確定哪個DIV標籤屬於哪個關閉DIV標籤,以及開發者是否對此有任何控制權。有任何想法嗎?

@:<div class="myOuterDivWithBorder"> 

for (int j = 0; j < 3; j++) 
{ 
    if (j == 0) 
    { 
     @:<div class="largeDiv"> 
    } 
    else if (j == 1) 
    { 
     @:<div class="mediumDiv"> 
    } 
    else if (j == 2) 
    { 
     @:<div class="smallDiv"> 
    } 

    @:</div> 
} 

@:</div> 


--Here's a glimpse into some of my actual code located within my for loop. Hopefully 
--this illustrates why I feel I am unable to position both my opening and closing DIVs 
--within the same scope ({}). 
    iCurrentDivSize = GetDivSize(question.Type.ToLower(), options); 

    if (iAvailableDivSpace == 3) 
    { 
     //Begin a new div. 
     @:<div class="wrapDivLarge"> 
    } 
    else //iAvailableDivSpace is 1 or 2 
    { 
     if (iCurrentDivSize > iAvailableDivSpace) 
     { 
      //First, close the previous OUTER div, and begin a new div. 
      @:</div> 
      @:<div class="wrapDivLarge"> 
      iAvailableDivSpace = 3; 
     } 
    } 

    //No new OUTER div tag; just new INNER div tag 
    switch (iCurrentDivSize) 
    { 
     case 1: 
      @:<div class="wrapDivSmall">      
      break; 
     case 2: 
      @:<div class="wrapDivMedium"> 
      break; 
    } 

    iAvailableDivSpace = iAvailableDivSpace - iCurrentDivSize; 

回答

1

或許不是編寫出整個標籤的,僅修改了什麼實際改變:

@{ 
    var divClasses = new string[] { "largeDiv", "mediumDiv", "smallDiv" }; 
} 

<div class="myOuterDivWithBorder"> 
@foreach (var divClass in divClasses) 
{ 
    <div class="@divClass"> 
    </div> 
} 
</div> 

哈克修復你的代碼是(不幹燥)以下。您遇到的問題是智能感知不會運行您的代碼,所以它無法弄清楚,無論哪個語句運行,您目前總是得到一個開始標記。智能感知的唯一真正解決方法是將結束標記放在相同的編程範圍內(即{})。

for (int j = 0; j < 3; j++) 
{ 
    if (j == 0) 
    { 
     @:<div class="largeDiv"> 
     @:</div> 
    } 
    else if (j == 1) 
    { 
     @:<div class="mediumDiv"> 
     @:</div> 
    } 
    else if (j == 2) 
    { 
     @:<div class="smallDiv"> 
     @:</div> 
    } 

} 
+0

恐怕我的代碼有點複雜。它檢查每個div的內容,並決定它是大,中或小的內容,併爲其分配適當的類別。這個想法是通過在每個外部分區內安裝3個DIV來節省空間。在這個OUTER DIV裏面,我可以裝3個小,1個小,1箇中,或者1個大。因此,此評估正在循環中完成,並且具有打開/關閉div標籤,如您所描繪的。它只是將它找到的第一個關閉div分配給我的OUTER DIV,並提前關閉它。有沒有辦法強制關閉DIV標籤來關閉特定的開放DIV標籤? – nightowl

+0

是的,更新你的例子。 –

+0

謝謝Erik。我不認爲我能夠在同一範圍內包含我的打開/關閉DIV標籤,除非您看到我沒有的東西。我在上面的示例下面張貼了我的實際代碼片段。你能從中得到什麼?我運氣不好嗎? – nightowl