2016-06-07 60 views
0

我已經有三個功能ASP.NET MVC應用程序。從數據可以列表: - 搜索 - 顯示結果 - 而從下拉列表ASP.NET MVC應用程序搜索,排序和過濾

選擇但它不能正常工作還沒有。當我在搜索後對搜索結果進行排序時,整個列表都會被排序,而不僅僅是搜索結果。我想查看從下拉列表中選擇的項目。但是,當我在下拉列表中選擇某項內容時,沒有任何反應。

控制器:

public class AddressController : Controller 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 

    // GET: Address 
    public ActionResult Index(string address, string sortOrder, string searchString) 
    { 
     var AddressList = new List<string>(); 

     var AddressQry = from d in db.Adres 
      orderby d.Address 
      select d.Address; 

     AddressList.AddRange(AddressQry.Distinct()); 
     ViewBag.address = new SelectList(AddressList); 

     ViewBag.AddressSortParm = String.IsNullOrEmpty(sortOrder) ? "address_desc" : ""; 
     ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date"; 
     ViewBag.LongitudeSortParm = sortOrder == "Longitude" ? "longitude_desc" : "Longitude"; 
     ViewBag.LatitudeSortParm = sortOrder == "Latitude" ? "latitude_desc" : "Latitude"; 

     var addresses = from s in db.Adres 
         select s; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      addresses = addresses.Where(s => s.Address.Contains(searchString)); 

     } 

     if (!String.IsNullOrEmpty(address)) 
     { 
      addresses = addresses.Where(s => s.Address == address); 

     } 

     switch (sortOrder) 
     { 
      case "address_desc": 
       addresses = addresses.OrderByDescending(s => s.Address); 
       break; 
      case "Date": 
       addresses = addresses.OrderBy(s => s.Date); 
       break; 
      case "date_desc": 
       addresses = addresses.OrderByDescending(s => s.Date); 
       break; 
      case "Longitude": 
       addresses = addresses.OrderBy(s => s.Longitude); 
       break; 
      case "longitude_desc": 
       addresses = addresses.OrderByDescending(s => s.Longitude); 
       break; 
      case "Latitude": 
       addresses = addresses.OrderBy(s => s.Latitude); 
       break; 
      case "latitude_desc": 
       addresses = addresses.OrderByDescending(s => s.Latitude); 
       break; 
      default: 
       addresses = addresses.OrderBy(s => s.Address); 
       break; 
     } 

     return View(addresses); 
    } 
} 

視圖

@model IEnumerable<Keuzevak.Models.Adres> 

@{ 
ViewBag.Title = "Index"; 
Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Addresses</h2> 
<p> 
@Html.DropDownList("address", "All") 
</p> 


@using (Html.BeginForm()) 
{ 
<p> 
    Search address: @Html.TextBox("SearchString") 
    <input type="submit" value="Search" class="btn btn-primary" /> 
</p> 
} 

<table> 
<tr> 
    <th> 
     @Html.ActionLink("Date", "Index", new {sortOrder =  ViewBag.DateSortParm}) 
    </th> 
    <th> 
     @Html.ActionLink("Longitude", "Index", new {sortOrder = ViewBag.LongitudeSortParm}) 
    </th> 
    <th> 
     @Html.ActionLink("Latitude", "Index", new {sortOrder = ViewBag.LatitudeSortParm}) 
    </th> 
    <th> 
     @Html.ActionLink("Address", "Index", new {sortOrder = ViewBag.AddressSortParm}) 
    </th> 
    <th></th> 
</tr> 

@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Date) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Longitude) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Latitude) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Address) 
     </td> 
    </tr> 
} 

+0

做你的行動methord更是創下同時給予請求 –

+0

你只形成回發searchString'的'值(address'的'值和'sortOrder'會'null')而你只鏈接後回sortOrder的值和其他值爲null –

回答

1

你需要告訴它會通過指定你的控制器動作來發送數據視圖..

您需要將表單中的字段包裹以發送給您的控制器離子法。

喜歡的東西..

@using (Html.BeginForm("Index", "Address")) 
{ 
    //Your dropdown here 
    //Your search param 
    //Your Sort 

    //Your submit btn 
} 

我會用<input type "text" name="searchString" />到您的文本發送到控制器了。

希望這有助於

1

你是不是傳遞三個參數來操作鏈接,但是你的動作方法需要3張操作數

0

考慮將您搜索的結果進入一個新的列表/集合。看起來重用正在發生

db.adres 

收集。

如果分開搜索,排序,地址到有自己獨立的功能,你甚至可能認爲這是更乾淨的代碼,並能夠創建一個新的列表,基於以前的搜索條件(控制器動作參數)。

要整理的標準,增加了一個新的類與SearchString在,SortOrder的,地址屬性,象下面這樣:

public string SearchString { get; set; } 
public string SortOrder {get; set; } 
public string Address { get; set; } 

而且,嘗試使用addresses.Find(searchString),而不是搜索和排序列表。

對於下拉列表中,請確保您正確加載你的下拉列表中,用合適的對象,這裏的這個鏈接的詳細信息:

http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

通常用於製作東西發生與下拉要使用一個網頁上的表單列表或東西,嘗試使用HTTP POST方法或獲取與下拉列表提交表單時,檢索信息/數據。

@using (Html.BeginForm("SearchItemChosen", "Index", FormMethod.Post)) { 

    <fieldset> 

      Addresses 

      @Html.DropDownList("address") 

     <p> 

      <input type="submit" value="Submit" /> 

     </p> 

    </fieldset> 

}