2009-09-14 3 views
0

ASP.NET MVC View에서 이와 같은 간단한 함수를 사용하고 싶습니다. 정수 매개 변수를 사용하고 문자열을 반환합니다.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 

내 컨트롤러에서 가져 왔지만 내보기에서 실행할 수 없습니다. 컴파일 타임 오류 "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> 

어디에서 내 기능을 넣어야합니까? 내 뷰에서 뷰에 액세스 할 수있게하려면 어떻게해야합니까?

답변

0

합니다. 이것은이 용도에 적합하지 않은 것으로 보입니다. 내 ASP.NET MVC보기에서 사용

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> 
+1

문서 (내가 이해 한대로)는 데이터 모델이므로 숫자로만 크기를 지정해야합니다. 그 숫자의 실제 시각화는 프리젠 테이션 레이어, 즉 뷰 (공통 기본 뷰 클래스가있는 경우), HtmlHelper 클래스 또는 다른 프리젠 테이션 관련 클래스에 남겨져 있어야합니다. –

+0

좋은 지적입니다, Franci.필자는 전문화 된 FileSize 데이터 유형이 모든 계층/계층에 가장 적합하다고 생각합니다. Data Annotations가 좋은 해결책인지 궁금합니다. 나는 그것에 대해 더 알 필요가있다. –

1

일단보기에 있으면 컨트롤러가 삭제되었습니다. 대신 유틸리티 클래스를 만들고 거기에 메서드를 넣거나 int에 확장 메서드를 만들 수 있습니다.

2

HtmlHelper 클래스의 확장 메소드로 추가 할 수 있습니다. 그런 다음보기의 Html 속성을 통해 호출 할 수 있습니다.

다음 예는 extend HtmlHelper입니다. 당신은 확장 파일 방법은 당신의보기에서 HTML 개체 그것에 대해 알 수 있도록 아래에있는 네임 스페이스를 가져올 수 있는지 확인하는 당신은 그것을에게 Html 헬퍼의 exentsion 방법을 만들 필요가

3

HTML 확장 방법을 살펴볼 수 있습니다. 이 같은 일을 만들 수 있습니다 : 당신이 ViewContext.Controller에 의해보기의 컨트롤러에 액세스 할 수 있지만

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) %>

를 사용하여 뷰 내에서이를 활용할 수 있습니다, 당신은에 해당 속성을 캐스팅해야합니다 당신이 기대하는 정확한 유형. 원하는 경우 컨트롤러 메소드를 호출 할 수 있습니다. 많은 사람들은보기를 특정 컨트롤러에 연결하기 때문에이 접근법을 좋아하지 않습니다. 인수를 위해서

는 다음과 같은 작업을해야합니다 : Html 헬퍼 확장 제안을 정말 상관 없어

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

는, 다음 가야

내가 대신 문서 클래스에 함수를 추가 뷰의 ViewModel에 추가합니다. 여러보기에서 공유되는 경우 HtmlHelper 확장은 하나의 옵션입니다. 그러나 문제의 모델 클래스 (기본적으로 ToString() 메서드를 재정의하거나 새 메서드를 추가하는 것을 의미)에 추가하면 HTML을 반환하지 않고 다른 부분에서도 사용할 수있는 원시 문자열 만 반환하면 좋습니다.

관련 문제