2014-07-14 2 views
0

ASP.NET MVC 4에서 샘플을 테스트하고 있습니다. HtmlHelper에 대한 확장 메소드를 만듭니다.이 람다에 전달 된 값

public ViewResult List(string category, int page = 1) 
{ 
    ProductsListViewModel model = new ProductsListViewModel { 
     Products = repository.Products 
      .Where(p => category == null || p.Category == category) 
      .OrderBy(p => p.ProductID) 
      .Skip((page - 1) * PageSize) 
      .Take(PageSize), 
     PagingInfo = new PagingInfo 
     { 
      CurrentPage = page, 
      ItemsPerPage = PageSize, 
      TotalItems = repository.Products.Count() 
     }, 
     CurrentCategory = category 
    }; 
    return View(model); 
} 

에 기초이 뷰에 대한 동작 방법을 정의하는 제어기가

@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, category = Model.CurrentCategory })) 

:

public static class PagingHelpers 
{ 
    public static MvcHtmlString PageLinks(this HtmlHelper html, 
     PagingInfo pagingInfo, 
     Func<int, string> pageUrl) 
    { 
     StringBuilder result = new StringBuilder(); 
     for (int i = 1; i <= pagingInfo.TotalPages; i++) 
     { 
      TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag 
      tag.MergeAttribute("href", pageUrl(i)); 
      tag.InnerHtml = i.ToString(); 
      if (i == pagingInfo.CurrentPage) 
       tag.AddCssClass("selected"); 
      result.Append(tag.ToString()); 
     } 
     return MvcHtmlString.Create(result.ToString()); 
    } 
} 

이는 아래 도면에 의해 사용된다 : 아래의 코드는 확장 메소드의 결과 (중단 점 사용), x의 값은 컨트롤러의 List 조치 메소드에서 'page'매개 변수입니다. x가 어떻게 그것을 파악 했습니까? 또는 값이 x에 어떻게 전달 되었습니까? 나는 주로 컬렉션을 사용하여 작업 할 때 LINQ에서 대리인을 주로 사용했습니다. 매개 변수로 전달 된 값은 컬렉션에서 가져온 값입니다 (반복됨). 그러나 나는 이것을 이해할 수없는 것 같습니다.

답변

1

기본적 Func<int, string> pageUrl 하나의 INT PARAM 어느 복귀 문자열을 가진 함수 을 의미한다.

당신은에 의해 for loop이 함수를 호출은 :

tag.MergeAttribute("href", pageUrl(i)); 

당신이 PAGEURL를 호출은 기본적으로 무언가 같이 호출 : 그래서 x => Url.Action("List", new { page = x, category = Model.CurrentCategory }) 여기에 단지 Url.Action 기능을 래핑 익명 함수를 의미

public String SomeFunction(int x) 
{ 
    return Url.Action("List", new { page = x, category = Model.CurrentCategory }); 
} 

+0

와우, 라인 태그를 보지 못했다고 생각하지 않습니다 .MergeAttribute ("href", pageUrl (i)). 감사! –

1

PagingHelpers.PageLinks 확장 방법은 Func<int, string> ~ URL을 생성합니다.

실제로 URL 생성은 확장 메서드가 아닌보기에서 제공되므로 확장 메서드는 보기에 정의 된 메커니즘을 URL 생성기로 사용하는 것입니다.

이 확장 방법은 다음과 같이 작동

  • I 루프 1 페이지의 수 나는 나에 전달 된 Func<int, string>에 의해 정의 된 링크를 생성
  • 사이
    • (I는하지 마십시오 내가 어떻게 작동하는지 신경 써라. 내가 int를주고, string를 되찾는다)
  • 나는 그것을 0에서 사용한다.

그래서보기를 봐 : Func<int, string>는 "나는 int로 x를 제공하고 있습니다 때,이 코드를 호출"말하는

@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, category = Model.CurrentCategory })) 

. 이렇게하면 URL 생성이보기에 의해 제어됩니다. 확장 메서드는 Url.Action에 의해 생성 된 결과 HTML에 관심이 있습니다.