我想在我的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能够访问它?
答案 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>