2012-02-27 27 views
0

我有一個帶有過濾器的搜索表單。 1過濾器是範圍,這是一個數字下拉。我有一個視圖使用一個查看範圍(我的數據庫表)ienumerable視圖和控制器我填充這個和所有的作品,因爲它應該...直到表單顯示,用戶試圖再次過濾,在這種情況下,我的模型視圖ienumerable現在爲null。爲什麼它會失去價值。我是否需要每次用戶重新設置一次新的過濾器......如果可以,不需要重複調​​用數據庫,因爲下拉列表中的值不會改變。MVC 3 Dropdownlist用於搜索的鏈接模態查看列表在回發中始終爲空

模式的看法

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); 


    } 

查看

@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> 

回答

0

如果下拉列表中的值不會改變(曾經),那麼你可能應該緩存它們服務器端,每次只重用這些值。您將需要每次向模型提供值,因爲數據不會在連續請求之間持續存在。 MVC中沒有視圖狀態來保留這些值。實際上,這是一件好事。

private static IEnumerable SearchRange { get; set; } 

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

public ActionResult Jobs(ViewModels.SearchResultsViewModel model) 
{ 
    model.Range = SearchRange; 
    ... 
} 
+0

請小心使用靜態集合,因爲它們不是線程安全的,您可能會遇到線程阻塞問題,如果您有多個人使用它,將導致您的應用程序掛起。您可以使用線程安全集合(System.Collection.Concurrent),或者您可以使用內置的HTTP緩存機制。我更喜歡使用'HttpRuntime.Cache',因爲它也適用於單元測試的環境中,因爲'this.HttpContext.Cache'需要HTTP上下文(或者需要模擬一個)。 – Makotosan 2012-02-27 21:28:47

+0

我會更關心它是不是隻讀集合。就個人而言,如果數據永遠不會改變,我可能會在代碼中實現它,例如'enum',或通過配置而不是從數據庫中獲取。使用緩存將是一個選項,如果它很大,但你可能必須建立一個刷新機制。如果使用EF,'DbSet '類對於靜態實例是線程安全的。 – tvanfosson 2012-02-27 21:36:52

+0

謝謝你的幫助。 @tvanfosson在你的例子中如何緩存項目服務器端,它似乎對我來說每次都獲得搜索範圍,但我可能會失去一些東西。我可以使用一個枚舉建議也,但我想學習如何做的事情,所以在某些時候,我將需要一個下拉的項目,可能會改變日常等謝謝 – Jonnymaboy 2012-02-27 22:45:27