剃刀视图页面中的VB语法

时间:2017-04-13 00:18:18

标签: html asp.net-mvc vb.net razor

这是我的MVC View页面VB代码,从控制器传递ViewData(“最大超出”)。也就是说,如果ViewData(“Maximum exceeded”)为true,它将呈现带有标签控件的行。我的VB语法有什么问题吗?如何将VB条件放在View页面中?

@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

2 个答案:

答案 0 :(得分:1)

你有Label(HtmlHelper, String, String)的论据是错误的。第一个字符串参数是expression,第二个字符串参数是labelText

您的If ViewData("Maximum exceed")检查是否有关键字"Maximum exceed",但expression值为"MaximumExceed"的词典成员 - 他们不匹配。

那就是说,你应该更喜欢一个强类型的视图模型&#34;而不是使用无类型的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

答案 1 :(得分:1)

由于@Using (Html.BeginForm())语句在&#34;代码块模式&#34;中开始一个表单,在VB.NET上下文中你需要设置&#34;文本模式&#34;使用@:(单行操作符),@<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通过应用&#34; text模式&#34;允许内联XML元素。内部&#34;代码块模式&#34;哪个C#没有这个功能(见Razor syntax for VB.NET)。

因此,应使用@标记<tr>之前的If来修改相关提供的示例,以便在@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 代码块下创建HTML块元素:

ViewBag

正如@Dai在他的回答中所说,我也更喜欢使用强类型&#34;视图模型&#34;使用属性而不是传递ViewDataPublic 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

查看

exportCategory()

相关问题:

Razor View Engine Quirks in VB.NET

Using in Razor VB.net MVC not work as expected