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

Asp.net mvc 如何在ASP.NET MVC视图中使用函数?,asp.net-mvc,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)

我想在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
函数FileSizeString(ByVal ByteCount作为整数)作为字符串
选择大小写字节数
案例<(2^10)
返回ByteCount.ToString(“N0”)+“B”
案例(2^10)至((2^20)-1)
返回(字节数/(2^10)).ToString(“N0”)+“KB”
案例(2^20)至((2^30)-1)
返回(字节数/(2^20)).ToString(“N0”)+“MB”
大小写(2^30)到Integer.MaxValue
返回(字节数/(2^30)).ToString(“N0”)+“GB”
结束选择
端函数
我把它放在我的控制器中,但是我不能在我的视图中执行它。这会产生编译时错误“未声明名称'FileSizeString'


我需要把我的函数放在哪里?如何使我的视图能够访问它?

一旦您在视图中,控制器已被释放-相反,您可以创建一个实用程序类并将方法放在那里,或者在int上创建一个扩展方法。

您可以将其作为扩展方法添加到类中。然后可以通过视图的属性调用它


下面是一个如何执行的示例。

您需要将其设置为一个HtmlHelper exentsion方法


完成此操作后,请确保导入extenstion方法所在的命名空间,以便视图中的Html对象了解它。

您可能需要查看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

我真的不喜欢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>

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

文档(据我所知)是您的数据模型,因此它应该只关心它作为一个数字的大小;这个数字的实际可视化应该留给表示层——视图(如果您有一个公共的基本视图类)、HtmlHelper类或另一个与表示相关的类。我认为专门的文件大小数据类型最适合所有层。我想知道数据注释是否是一个很好的解决方案。我需要更多地了解这一点。
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
<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>