2011-03-10 4 views
3

MVC3 MusicStore 자습서에 문제가 있습니다. Truncate 메서드를 사용하여 HtmlHelper를 정의합니다.MVC3 자습서 HtmlHelper가 작동하지 않습니다.

보기, I, 그것은 @using MusicStore.Helpers를 사용하여 가져온 다음 컴파일러는 나에게 그런 방법 (자르기) 존재를 알려줍니다 그러나 <td>@Html.Truncate(item.Title, 25) </td>

와 함께 사용하려고에서

using System.Web.Mvc; 

namespace MusicStore.Helpers 
{ 
    public class HtmlHelpers 
    { 
     public static string Truncate(this HtmlHelper helper, string input, int length) 
     { 
      if (input.Length <= length) 
      { 
       return input; 
      } 
      else 
      { 
       return input.Substring(0, length) + "..."; 
      } 
     } 
    } 
} 

과 같다 : 도우미는 다음과 같습니다 내 HtmlHelpers 클래스가 아닌 IEnumerable [MvcMusicStore.Models.Album] (내 모델)에서자를 찾고 있습니다.

(NB 대괄호 위의 내 코드에서 정말 꺾쇠 괄호가있는 그들을 탈출을 couldnt)

사람이 내가 잘못하시기 바랍니다 뭘하는지 말해 줄래?

public static class HtmlHelpers 
{ 
    public static string Truncate(
     this HtmlHelper helper, 
     string input, 
     int length 
    ) 
    { 
     if (input.Length <= length) 
     { 
      return input; 
     } 
     return input.Substring(0, length) + "..."; 
    } 
} 

을 다음보기에서 당신이 확장 방법으로 정적 클래스를 포함하는 네임 스페이스 참조했는지 확인 :

답변

9

확장 방법은 정적 클래스로 선언되어야한다

@using System.Web.Mvc 
... 
<td>@Html.Truncate(item.Title, 25)</td> 

또는 using 지시문을 추가 할 필요없이 모든 면도기보기에서 도우미를 사용할 수있게하려면 해당 네임 스페이스를 ~/Views/web.config 파일의 네임 스페이스 섹션에 추가하면됩니다.

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="Namespace.Containig.Static.Class.With.Custom.Helpers" /> 
     </namespaces> 
    </pages> 
</system.web.webPages.razor> 
+0

+1 사이드 노트 - MVC3에서 HTML 헬퍼 용으로 'IHtmlString'을 사용했습니다. MVC3에서 사용해야합니까? 다른 클래스가이 인터페이스를 구현하는지 잘 모르겠습니다. 아니면 우리가 이것을하는 단위 테스트 (조롱)를위한 것입니까? – RPM1984

+0

@ RPM1984 예, 리턴 타입으로'IHtmlString'을 사용할 수 있습니다. 더 정확할 것입니다. 단위 테스트를 위해 리턴 타입을 사용하지 않기 때문에 조롱하는 것에 신경 쓰지 않습니다. 계층 구조에서 더 높은 클래스/인터페이스를 사용하는 것이 좋습니다. –

+1

** IHtmlString **을 반환하지 마십시오. 그건 HTML이 아니므로 탈출해야합니다. – SLaks

0

확장 메서드는 정적 클래스로 정의해야합니다. 그래서 당신 코드를 변경 :

public static class HtmlHelpers 
{ 
    public static string Truncate(this HtmlHelper helper, string input, int length) 
    { 
     if (input.Length <= length) 
     { 
      return input; 
     } 
     else 
     { 
      return input.Substring(0, length) + "..."; 
     } 
    } 
} 

는 또한, @Darin 디미트로프는 좋은 지적을 제공합니다 - 당신은 정말 MvcHtmlString의 인스턴스를 retrun한다.

관련 메모에서 web.config를 통해 네임 스페이스를보기로 가져올 수 있습니다. 이렇게하면 모든 페이지에서이를 수행 할 필요가 없으므로 그렇게하는 것이 좋습니다.

+0

아, 둘 다 감사합니다 (너무 빨리!). 자습서의 전체 솔루션은 약간 깨진 것 같습니다. 첫째, 클래스를 정적으로 (oops) 만들고 MvcHtmlString도 반환하도록 변경하는 것을 잊었습니다. 비록 내가 실제로 내 View에서 그것을 사용할지를 지정할 필요가 없기 때문에 args 문법 (이 HtmlHelper 도우미)을 이해하지 못한다는 것을 인정해야하지만 args의 수는 정확하다. 그러나 나는 그것이 프레임 워크가 전달하는 것이라고 생각한다. 자동으로? – Richard

+0

정확히 ... 확장 메서드라고합니다 - 여기를 참고하십시오 http://msdn.microsoft.com/en-us/library/bb383977.aspx & http://en.wikipedia.org/wiki/Extension_method – Charlino

+1

* * IHtmlString **을 반환하지 마십시오. 그건 HTML이 아니므로 탈출해야합니다. – SLaks

0

web.config에 네임 스페이스를 추가하는 것도 좋습니다. 내 헬퍼를 여러 페이지에서 사용한다는 것을 알고 있습니다. 모든보기에 using을 추가하는 것을 기억하는 것은 고통입니다.

<system.web> 
    <pages> 
    <namespaces> 
     <add namespace="MusicStore.Helpers"/> 
    </namespaces> 
    </pages> 
</system.web> 
관련 문제