MVC 3 Dropdownlist для связанного модального списка для поиска всегда нулевой при обратной передаче - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть форма поиска с фильтрами. 1 фильтр - это диапазон, который должен быть выпадающим с номерами. У меня есть представление с использованием viewmodal с неисчислимым диапазоном поиска (моя таблица БД), и в контроллере я заполняю это, и все работает как надо ... до тех пор, пока форма не отобразится, и пользователь не попытается снова отфильтровать, в этом случае мой представление модели теперь не имеет значения. Почему он теряет ценности. Нужно ли повторно вводить это каждый раз, когда пользователи выполняют новый фильтр ... если это так, то это можно сделать без повторных обращений к базе данных, поскольку значения в раскрывающемся списке не изменятся.

модальный вид

public class SearchResultsViewModel
{
    public int? Page { get; set; }
    public penguin.Models.Job Job { get; set; }
    public IPagedList<Models.Job> SearchResults { get; set; }
    public string SearchButton { get; set; }

    [Display(Name = "keywords")]
    public string keywords { get; set; }
    [Display(Name = "location")]
    public string location { get; set; }
    public int RangeID { get; set; }
    public IEnumerable<Models.SearchRange> Range { get; set; } 

}

Контроллер

const int RecordsPerPage = 25;
    public ActionResult Jobs(ViewModels.SearchResultsViewModel model)
    {

        // do something with the search value                    
        if (!string.IsNullOrEmpty(model.SearchButton) || model.Page.HasValue)
        {

            var entities = new Models.DBDataContext();
            var results = entities.Jobs;

            var pageIndex = model.Page ?? 1;
            model.SearchResults = results.ToPagedList(pageIndex, 25);

            //Range = ViewData["Range"] as IEnumerable<Models.SearchRange>; 
        }
        else {
            var Data = Helpers.ModelHelpers.GetDataContext();
            var ranges = (from r in Data.SearchRanges select r);
            model.Range = ranges;
            //Range = ranges;

        }
        //ViewData["Range"] = Range;
        //model.Range = Range;
        return View(model);


    } 

View

@using PagedList.Mvc;
@model ViewModels.SearchResultsViewModel           
@{
    ViewBag.Title = "Jobs";
}
@section search {
 @using (Html.BeginForm("Jobs", "Search", FormMethod.Post, new { id = "searchForm" }))
{ 
    <fieldset>
        @Html.LabelFor(m => m.keywords)
        @Html.TextBoxFor(m => m.keywords)
        @Html.LabelFor(m => m.location)
        @Html.TextBoxFor(m => m.location)

        @Html.DropDownListFor(m => m.RangeID, new SelectList(Model.Range, "ID", "Range", 5))
        <input name="SearchButton" type="submit" value="Search" />
    </fieldset>

  }
 }
<h2>
Jobs</h2>
<div id="resultContainer">
my paged results set will go in here with a link to view job details. I then want
it to come back here and not lose anything 
@* html.Action("Results", "Search")*@
@if (Model.SearchResults != null && Model.SearchResults.Count > 0)
{
    foreach (var result in Model.SearchResults)
    {
    <hr />
    <table width="100%">
        <tr>
            <td valign="top">
                <div style="font-weight: bold; font-size: large;">
                    @Html.Raw(@result.Title.Truncate(50))</div>
                @Html.Raw(@result.summary.Truncate(50))<br />
                </td>
                    </tr>
    </table>

    }

    <hr />        

    @Html.PagedListPager(Model.SearchResults, page => Url.Action("Jobs", new RouteValueDictionary() {
                { "Page", page }, 
                { "Job", Model.Job }
                }), PagedListRenderOptions.DefaultPlusFirstAndLast)}
    </div>

1 Ответ

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

Если значения в раскрывающемся списке не изменятся (никогда), то вам, вероятно, следует кэшировать их на стороне сервера и просто повторно использовать значения каждый раз.Вам нужно будет указывать значения для модели каждый раз, так как данные не сохраняются между последовательными запросами.В MVC НЕТ viewstate для сохранения значений.На самом деле это хорошая вещь.

private static IEnumerable SearchRange { get; set; }

static SearchController()
{
   SearchRange = new MyDataContext().SearchRanges.AsEnumerable();
}

public ActionResult Jobs(ViewModels.SearchResultsViewModel model)
{ 
    model.Range = SearchRange;
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...