2017-04-13 73 views
-1

這是我的MVC查看頁面VB代碼,即從控制器傳遞ViewData(「最大超出」)。也就是說,如果ViewData(「最大超過」)爲true,則它將呈現帶有標籤控制的行。我的VB語法有什麼問題嗎?我怎樣才能把VB條件放在View頁面中?剃鬚刀查看頁面中的VB語法

@Using (Html.BeginForm()) 
@<table> 

    @If ViewData("IsMaximumExceed") Then 
    <tr> 
     <td colspan="3"> 
      @Html.Label(
       Sub(settings) 
        settings.AssociatedControlName = "MaximumExceed" 
        settings.Text = "Maximum Exceed"                
       End Sub).GetHtml() 
     </td> 
    <tr> 
</table> 
End Using 
+1

什麼問題?它對我來說看起來沒問題......但請注意,VB不支持ASP.NET Core(包括Razor),因此您應該儘快過渡到C#。 – Dai

+0

請注意,在ASP.NET MVC中沒有「控件」 - 「Html.Label」是一個「HTML助手」,它以無狀態方式直接呈現HTML。 – Dai

+0

我在剃刀視圖中得到了​​元素的VB語法錯誤,所以語法錯在哪裏? – Julia

回答

0

由於@Using (Html.BeginForm())語句開始在「代碼塊模式」形式,在VB.NET上下文需要設置「文本模式」或者使用@:(單線操作者),@<text>...</text>(單個或多個線模式)或簡單地@隨後用HTML塊元素:

' Using @: 
@Using (Html.BeginForm()) 
@:<table cellpadding="0" cellspacing="0" style="width: 800px; height:100px;"> 
    <!-- inner table --> 
@:</table> 
End Using 

' Using @<text>...</text> 
@Using (Html.BeginForm()) 
@<text><table cellpadding="0" cellspacing="0" style="width: 800px; height:100px;"> 
     <!-- inner table --> 
</table></text> 
End Using 

'Using @<tag>...</tag> 
@Using (Html.BeginForm()) 
    @<table cellpadding="0" cellspacing="0" style="width: 800px; height:100px;"> 
      <!-- inner table --> 
    </table> 
End Using 

後面運營商HTML標籤括起來的用法的原因是,VB.NET允許內聯XML元素通過施加「文本模式」內部「代碼塊模式」,其C#不具有該功能(請參閱Razor syntax for VB.NET)。

因此,問題所提供的樣本應該修改這個樣子,用@<tr>標籤下If代碼塊創建HTML塊元素:

@Using (Html.BeginForm()) 
@<table cellpadding="0" cellspacing="0" style="width: 800px; height:100px;"> 
@If ViewData("IsGroupVessel") Then 
@<tr> 
     <td colspan="3"> 
     @Html.DevExpress().Label(Sub(settings) 
      settings.AssociatedControlName = "GroupBooking" 
      settings.Text = "Maximum Exceeded"                
     End Sub).GetHtml() 
     </td> 
    </tr> 
    End If 
</table> 
End Using 

由於@Dai在他回答說,我也喜歡強類型「視圖模型」具有屬性的使用而不是傳遞ViewBagViewData或,因此修改後的代碼如下所示:

模型

Public Class ViewModel 
    Public Property IsExceeded As Boolean 
    ' other models 
End Class 

控制器

Public Function ActionMethod() As ActionResult 
    Dim model As New ViewModel 
    ' other logic 
    model.IsExceeded = True 
    ' other logic 
    Return Me.View(model) 
End Function 

查看

@ModelType ViewModel 

@Using (Html.BeginForm()) 
@<table cellpadding="0" cellspacing="0" style="width: 800px; height:100px;"> 
@If Model.IsExceeded Then 
@<tr> 
     <td colspan="3"> 
     @Html.DevExpress().Label(Sub(settings) 
      settings.AssociatedControlName = "GroupBooking" 
      settings.Text = "Maximum Exceeded"                
     End Sub).GetHtml() 
     </td> 
    </tr> 
    End If 
    </table> 
End Using 

相關的問題:

Razor View Engine Quirks in VB.NET

Using in Razor VB.net MVC not work as expected

+0

我明白了,這正是我所期待的。非常感謝。 – Julia

+0

@Julia歡迎來到Stack Overflow。請考慮[接受](https://meta.stackexchange.com/q/5234/179419)解決您的問題的答案,方法是單擊答案旁邊的複選標記,表示您已找到解決方案。沒有義務這樣做。 –

0

您有錯誤的方法Label(HtmlHelper, String, String)的參數。第一個字符串參數是expression,第二個字符串參數是labelText

If ViewData("Maximum exceed")您的If ViewData("Maximum exceed")檢查是否有字典成員的密鑰"Maximum exceed"expression值是"MaximumExceed" - 他們不匹配。也就是說,您應該更喜歡使用強類型的「視圖模型」對象,而不要使用無類型對象ViewDataViewBag

Public Class MyPageViewModel 

    Public MaximumExceeded As Boolean 

End Class 

... 

Public Function MyControllerAction() As ActionResult 

    Dim viewModel As New MyPageViewModel 
    viewModel.MaximumExceeded = True 
    Return Me.View(viewModel) 

End Sub 

... 

@Model MyPageViewModel 

@If Model.MaximumExceeded Then 

    @Html.Label(NameOf(Model.MaximumExceeded), "Maximum exceeded") 

End If 

注意我使用NameOf操作來獲得屬性的字符串名稱。或者更好的是,使用Html.LabelFor

+0

非常感謝您的回覆。我將在剃刀視圖中應用表達式。 – Julia

+0

但是我想在表格行中顯示Label控件,我怎樣才能在視圖中放置VB語法條件? – Julia

+0

@If ViewData的( 「最大超過」)然後 @ Html.Label(NameOf(Model.MaximumExceeded), 「最大超過」) 結束如果 – Julia