如何在ASP.NET MVC视图中使用函数?

时间:2009-09-14 21:28:33

标签: asp.net-mvc

我想在我的ASP.NET MVC视图中使用这样的简单函数。它接受一个整数参数并返回一个字符串。

Function FileSizeString(ByVal ByteCount As Integer) As String
    Select Case ByteCount
        Case Is < (2 ^ 10)
            Return ByteCount.ToString("N0") + "B"
        Case (2 ^ 10) To ((2 ^ 20) - 1)
            Return (ByteCount / (2 ^ 10)).ToString("N0") + "KB"
        Case (2 ^ 20) To ((2 ^ 30) - 1)
            Return (ByteCount / (2 ^ 20)).ToString("N0") + "MB"
        Case (2 ^ 30) To Integer.MaxValue
            Return (ByteCount / (2 ^ 30)).ToString("N0") + "GB"
    End Select
End Function

我已经在我的控制器中获得了它,但我无法在我的视图中执行它。这会产生编译时错误“Name'FileSizeString'未声明。”

<ul>
    <% For Each d As Document In Model.Attachments%>
    <li>
        <a href="<%=Url.RouteUrl("Download", New With {.id = a.Id}) %>">
            <%=d.FileName %> (<%=FileSizeString(d.FileSize) %> bytes)
        </a>
    </li>
    <% Next %>
</ul>

我需要在哪里放置我的功能?如何让我的View能够访问它?

6 个答案:

答案 0 :(得分:3)

您可能希望查看Html扩展方法。你可以创建一个这样的:

Public Module FileSizeExtension
  <Extension()> _
  Public Shared Function FileSizeAsString(ByVal helper AS HtmlHelper,
                                          ByVal byteCount As Integer) As String
    Select Case ByteCount  
     Case Is < (2 ^ 10)
       Return ByteCount.ToString("N0") + "B"
     Case (2 ^ 10) To ((2 ^ 20) - 1)
       Return (ByteCount / (2 ^ 10)).ToString("N0") + "KB"
     Case (2 ^ 20) To ((2 ^ 30) - 1)
       Return (ByteCount / (2 ^ 20)).ToString("N0") + "MB"
     Case (2 ^ 30) To Integer.MaxValue
       Return (ByteCount / (2 ^ 30)).ToString("N0") + "GB"
    End Select
  End Function
End Module

您现在可以使用<%= Html.FileSizeAsString(byteCount) %>

在视图中利用此功能

虽然您可以通过ViewContext.Controller访问View的控制器,但您需要将该属性转换为您期望的确切类型。然后,您可以根据需要调用控制器方法。许多人不喜欢这种方法,因为它将您的View耦合到特定的控制器。

为了论证,以下内容应该有效:

<% Dim homeController AS HomeController = 
    TryCast(ViewContext.Controller, HomeController) %>
<ul>
 <% For Each d As Document In Model.Attachments%>
 <li>
  <a href="<%=Url.RouteUrl("Download", New With {.id = a.Id}) %>">
   <%=d.FileName %> (<%= homeController.FileSizeString(d.FileSize) %> bytes)
  </a>
 </li>
 <% Next %>
</ul>

答案 1 :(得分:2)

您可以将其作为扩展方法添加到HtmlHelper类。然后,您可以通过View的Html属性调用它。

以下是extend HtmlHelper的示例。

答案 2 :(得分:1)

一旦你进入视图,控制器就被处理了 - 相反,你可以创建一个实用程序类并将你的方法放在那里,或者在int上创建一个扩展方法。

答案 3 :(得分:1)

你需要使它成为一个HtmlHelper exentsion方法......

完成后,请确保导入扩展方法所在的命名空间,以便视图中的Html对象知道它。

答案 4 :(得分:1)

如果它专门针对此View,那么它应该进入View的ViewModel。如果它在多个视图中共享,那么扩展HtmlHelper是一种选择。但是将它添加到有问题的模型类(这基本上意味着重写ToString()方法或添加一个新方法)如果它不返回HTML但只返回一个可以在其他部分中使用的原始字符串也是好的。

答案 5 :(得分:0)

我并不关心HtmlHelper扩展建议。这似乎不适合这种用途。

我在Document类中添加了一个函数:

Partial Public Class Document

    Function FileSizeString() As String
        Select Case Me.FileSize
            Case 1 To ((2 ^ 10) - 1)
                Return Me.FileSize.ToString("N0") + "B"
            Case (2 ^ 10) To ((2 ^ 20) - 1)
                Return (Me.FileSize / (2 ^ 10)).ToString("N0") + "KB"
            Case (2 ^ 20) To ((2 ^ 30) - 1)
                Return (Me.FileSize / (2 ^ 20)).ToString("N0") + "MB"
            Case (2 ^ 30) To Integer.MaxValue
                Return (Me.FileSize / (2 ^ 30)).ToString("N0") + "GB"
            Case Else
                Throw New ArgumentOutOfRangeException("byteCount", "Value must be a positive integer.")
                Return "unknown size"
        End Select
    End Function

End Class

我在ASP.NET MVC视图中使用的内容:

<ul>
    <% For Each d As Document In Model.Attachments%>
    <li>
        <a href="<%=Url.RouteUrl("Download", New With {.id = d.Id}) %>">
            <%=d.FileName %> (<%=d.FileSizeString %>)
        </a>
    </li>
    <% Next %>
</ul>