Как использовать функцию в моем ASP.NET MVC View? - PullRequest
0 голосов
/ 15 сентября 2009

Я хочу использовать такую ​​простую функцию в моем ASP.NET MVC View. Он принимает целочисленный параметр и возвращает строку.

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 не объявлено».

<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 ]

3 голосов
/ 15 сентября 2009

Возможно, вы захотите изучить методы расширения 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) %>

Несмотря на то, что вы можете получить доступ к контроллеру View с помощью ViewContext.Controller, вам нужно привести это свойство к тому типу, который вы ожидаете. Затем вы можете вызвать метод контроллера, если хотите. Многим людям не нравится этот подход, потому что он связывает ваше представление с конкретным контроллером.

Ради аргумента должно работать следующее:

<% 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>
2 голосов
/ 15 сентября 2009

Вы можете добавить его как метод расширения к классу HtmlHelper. Затем вы можете вызвать его через свойство Html представления.

Вот пример того, как расширить HtmlHelper .

1 голос
/ 15 сентября 2009

Если это специально для этого вида, то он должен перейти в ViewModel вида. Если он разделен между несколькими представлениями, то расширение HtmlHelper является одним из вариантов. Но добавить его к рассматриваемому классу модели (что в основном означает переопределение метода ToString () или добавить новый) хорошо, если он не возвращает HTML, а только необработанную строку, которая может использоваться и в других частях.

1 голос
/ 15 сентября 2009

Вам нужно сделать это методом расширения HtmlHelper ...

Как только вы это сделаете, убедитесь, что вы импортируете пространство имен, под которым находится метод расширения, чтобы ваш объект HTML в вашем представлении знал об этом.

1 голос
/ 15 сентября 2009

Когда вы находитесь в представлении, контроллер удаляется - вместо этого вы можете создать служебный класс и поместить туда свой метод или создать метод расширения для int.

0 голосов
/ 15 сентября 2009

Меня не волнуют предложения по расширению 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...