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>
請小心使用靜態集合,因爲它們不是線程安全的,您可能會遇到線程阻塞問題,如果您有多個人使用它,將導致您的應用程序掛起。您可以使用線程安全集合(System.Collection.Concurrent),或者您可以使用內置的HTTP緩存機制。我更喜歡使用'HttpRuntime.Cache',因爲它也適用於單元測試的環境中,因爲'this.HttpContext.Cache'需要HTTP上下文(或者需要模擬一個)。 – Makotosan 2012-02-27 21:28:47
我會更關心它是不是隻讀集合。就個人而言,如果數據永遠不會改變,我可能會在代碼中實現它,例如'enum',或通過配置而不是從數據庫中獲取。使用緩存將是一個選項,如果它很大,但你可能必須建立一個刷新機制。如果使用EF,'DbSet'類對於靜態實例是線程安全的。 –
tvanfosson
2012-02-27 21:36:52
謝謝你的幫助。 @tvanfosson在你的例子中如何緩存項目服務器端,它似乎對我來說每次都獲得搜索範圍,但我可能會失去一些東西。我可以使用一個枚舉建議也,但我想學習如何做的事情,所以在某些時候,我將需要一個下拉的項目,可能會改變日常等謝謝 – Jonnymaboy 2012-02-27 22:45:27