Параметры из вида не попадают в метод действия контроллера - PullRequest
0 голосов
/ 09 февраля 2012

Я реализую PagedList Троя Гуда в одном из моих представлений (ASP.NET MVC 3 Razor).Проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю на ссылку с номером страницы, запрос направляется моему методу HttpGet, который просто возвращает пустую страницу (готовую для ввода).

My View Модель:

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"

Любая помощь с этим будет очень признателен!

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Ссылки на номер страницы запускают запрос GET, поэтому вам нужно убедиться, что ваше действие GET также может обрабатывать полный поиск, поэтому вам потребуется получить номер страницы и массив отраслей - с использованием значений по умолчаниюкогда эти параметры недоступны.

например,

[HttpGet]
public ViewResult Search(string searchTerm = "", int page = 1, 
     string industries = "")
{
    //.....
}

Вам нужно будет изменить ссылку на пейджер, как это, чтобы передать отрасли действия 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 или что оно делает с ним, но вам понадобится какой-то способ передать это то же самое в свой код.действие, вероятно, как одна строка, разделенная запятой.В приведенном мною примере предполагается, что вы взяли его из списка выбора в модели представления

0 голосов
/ 10 февраля 2012

Нажав кнопку, вы отправляете форму, поэтому она делает httppost. Ссылка на следующую страницу правильно указывает на httpget, но вы не передаете ему никакой информации, чтобы он знал, что нужно get. Для получения нужна другая информация, например, какая страница вам нужна.

...