2012-02-09 17 views
0

私のビュー(ASP.NET MVC 3 Razor)の1つにTroy GoodeのPagedListを実装しています。私が抱えている課題は、ページ番号のリンクをクリックするとリクエストがHttpGetメソッドにルーティングされ、空のページ(入力可能)が返されます。ビューからのパラメータがコントローラのアクションメソッドに到達しない

マイビューモデル:

public class SearchViewModel 
{ 
    public SelectList IndustrySelectList { get; set; } 
    public IPagedList<KeyValuePair<string, SearchResult>> SearchResults { get; set; } 
    public PagingInfo PagingInfo { get; set; } 
} 

コントローラー:

[HttpGet] 
    public ViewResult Search(string searchTerm = "") 
    { 
     SearchViewModel vm = new SearchViewModel 
     { 
      IndustrySelectList = new SelectList(_Industries.AsEnumerable(), "IndustryId", "IndustryName"), 
      PagingInfo = new PagingInfo 
      { 
       CurrentPage = 1, 
       ItemsPerPage = 25, 
       TotalItems = 0 
      } 
     }; 

     return View(vm); 
    } 

    [HttpPost] 
    public ActionResult Search(string[] industries, string searchTerm = "", int page = 1) 
    { 
     SearchViewModel vm = null; 

     _url = "http://localhost/MasterNode/masternode.cgi?zoom_query={" + searchTerm + "}&zoom_xml=1&zoom_page={startPage?}&zoom_per_page=1000"; 
     StringBuilder sb = new StringBuilder(); 
     int pageSize = 5; 

     if (string.IsNullOrEmpty(searchTerm)) 
     { 
      vm = new SearchViewModel 
      { 
       IndustrySelectList = new SelectList(_Industries.AsEnumerable(), "IndustryId", "IndustryName") 
      }; 
     } 
     else 
     { 
      _request = new SearchRequest(SearchRequest.EnvironmentTypes.Development, "", _url, searchTerm, SearchRequest.SearchType.AllWords, 1000); 
      sb.Append(GetResults(_url)); 
      _results = new Dictionary<string, SearchResult>(); 
      ParseResults(sb); 
      GetDetailInformationForResults(searchTerm); 

      vm = new SearchViewModel 
      { 
       IndustrySelectList = new SelectList(_Industries.AsEnumerable(), "IndustryId", "IndustryName"), 
       SearchResults = _results.ToList<KeyValuePair<string, SearchResult>>().ToPagedList(1, 25), 
       PagingInfo = new PagingInfo 
       { 
        CurrentPage = page, 
        ItemsPerPage = pageSize, 
        TotalItems = _results.Count() 
       } 
      }; 
     } 
     return View(vm); 
    } 

ビュー:

@model MultiView.OmniGuide.ViewModels.SearchViewModel 
@using MultiView.OmniGuide.HtmlHelpers 
@using PagedList 
@using PagedList.Mvc 
@{ 
    ViewBag.Title = "Search"; 
} 
<link href="/Content/PagedList.css" rel="stylesheet" type="text/css" /> 

@using (Html.BeginForm("Search", "Home")) 
{ 
    @Html.HiddenFor(c => c.IndustrySelectList) 
    @Html.HiddenFor(c => c.PagingInfo) 
    @Html.HiddenFor(c => c.SearchResults) 
    <table width="70%"> 
     <tr> 
      <td colspan="2" style="background: #fff"> 
       <input id="searchTerm" name="searchTerm" type="text" class="SearchBox" style="width: 450px" /> 
       <input type="submit" class="SearchButton" value=" " /> 
      </td> 
     </tr> 
     <tr align="left"> 
      <td align="left" style="background: #fff"> 
       @Html.ActionLink("MultiView corporate site", "Search") 
      </td> 
     </tr> 
     <tr> 
      <td colspan="1" align="center" style="width: 450px"> 
       @{ 
        Html.Telerik().PanelBar() 
         .Name("searchPanel") 
         .Items(title => 
         { 
          title.Add() 
           .Text("Filter by Industry") 
           .Content(() => 
           { 
            @Html.RenderPartial("_Industry", @Model); 
           }); 
         }) 
         .Render();  
       } 
      </td> 
     </tr> 
     <tr><td colspan="2"></td></tr> 
    </table> 
    <br /> 
    if (Model.SearchResults != null) 
    { 
     <table width="70%"> 
      <tr> 
       <th> 
        Company Image 
       </th> 
       <th class="tableHeader"> 
        Company Name Here 
       </th> 
       <th class="tableHeader"> 
        Website 
       </th> 
      </tr>  
     @foreach (KeyValuePair<string, MultiView.OmniGuide.Models.SearchResult> itm in Model.SearchResults) 
     { 
      <tr> 
       <td align="left" style="width: 15%"> 
        @itm.Value.DetailedInfo.LogoURL 
       </td> 
       <td align="left" style="width: 60%"> 
        <p style="text-align: left"> 
        @itm.Value.DetailedInfo.DescriptionAbbreviated 
        <br /> 
        </p> 
        @Html.AnchorLink(itm.Value.FoundURL, itm.Value.FoundURL) 
       </td> 
       <td style="width: 25%"> 
        @itm.Value.FoundURL 
       </td> 
      </tr> 
     } 
     </table>  
     @Html.PagedListPager((IPagedList)Model.SearchResults, page => Url.Action("Search", "Home", new { page })) 
    } 
} 

テキストが入力ボックスに供給され、ボタンがクリックされ、要求されましたHttpPostメソッドにルーティングされます。 request.formの値を見ると、予想されるすべてのデータであるがページング情報が存在します。

?HttpContext.Request.Form.AllKeys 
{string[5]} 
    [0]: "IndustrySelectList" 
    [1]: "PagingInfo" 
    [2]: "SearchResults" 
    [3]: "searchTerm" 
    [4]: "industries" 

これに関するお手伝いをさせていただきます。

答えて

0

フォームを送信しているボタンをクリックすると、httppostが表示されます。次のページのリンクは正しくhttpgetに当たっていますが、何を知っているかを知るためには何も情報を渡していません。get。 getには、あなたが望むページのような他の情報が必要です。

0

ページ番号リンクはGETリクエストを送信するので、GETアクションでも完全な検索を処理できることを確認する必要があるため、ページ番号と業界の配列を取得する必要がありますパラメータは使用できません。

産業をgetアクションに渡すには、このようなページャーリンクを変更する必要があります。

@Html.PagedListPager((IPagedList)Model.SearchResults, page => Url.Action("Search", "Home", new { page, industries = string.Join(",", Model.IndustrySelectList.Where(x => x.Selected).Select(x => x.Text)) }))

それはあなたのポストのアクションからstring[] industriesを取得しているコード、または何それはそれでやっているから、私には明確ではないのですが、あなたはあなたのgetアクションにこの同じを渡すのいくつかの方法が必要になります、おそらくコンマで区切られた単一の文字列として扱われます。私が提供した例は、あなたがビューモデルの選択リストからそれを取ったと仮定したものです。

+0

ありがとうございました!私は完全な検索を処理するためにGETアクションを変更しました。しかし、ページリンクをクリックすると、2ページ目でGETアクションが2回呼び出されます。または、4ページ目のリンクをクリックすると4回。 – Rodney

+0

ちょっと奇妙な音がする - リンクをクリックすると、アクションが1回だけ要求されます。おそらくあなたの行動を取ることは、それ自身を呼び出すことです。コードをステップ実行し、そうであるかどうかを確認します。 – StanK

関連する問題