2010-12-23 64 views
12

我在asp.net mvc中嘗試了幾個網格。 微軟有一個網格太瞭解mvc 3的預發佈,所以我想我會嘗試一個。asp.net mvc 3 webgrid排序仍然是?sortdir = ASC

基本功能很容易實現,但在排序時,我遇到了一些問題。 網格通過url處理它的排序。在URL中你有排序列,並以下列方式排序方向: sortdir = ASC &排序= ABONNEMENT

現在你會期望你已經完成了後上的某些列進行排序時,sortdir查詢字符串在那一欄將改爲?sortdir = DESC 但它沒有。它保持?sortdir = ASC。 有誰知道這是一個錯誤還是一個功能,以及如何解決這個問題?

另一個非常煩人的事情︰如果我點擊一個排序鏈接,一個httpget請求完成。 因此,我放棄了我的模型。因爲網頁上有可能過濾網格(搜索功能),所以我想在模型中保留這一點。 在我看來,將這些數據置於模型狀態比將它存儲在會話狀態更簡單。 是否可以更改排序標題鏈接的行爲,以便執行http post?

對此的任何想法或想法? Tnx的幫助。

格爾茨,公園

視圖的代碼如下:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<table> 
    <tr> 
     <td> 
      <h1 class="normal">List of subscription</h1> 
     </td> 
     <td> 

     </td> 
    </tr> 
</table> 
<% using (Html.BeginForm("List", "Subscription", FormMethod.Post)) { %> 

<table border="0" cellpadding="0" cellspacing="5"> 
    <tr> 
     <td> 
      Search By 
     </td> 
     <td> 
      <%: Html.DropDownListFor(m => m.SearchByColumn, Ogone.FrontEnd.Web.Controllers.SubscriptionController.SubscriptionSearchList) %> 
     </td> 
     <td> 
      <%: Html.TextBoxFor(m => m.SearchByText) %> 
     </td> 
     <td> 
      <input name="button" type="submit" value="Search" /> 
     </td> 
    </tr> 
</table> 

<div> 
<% 
var grid = new System.Web.Helpers.WebGrid(Model.SubscriptionList, 
       columnNames: new List<string>(){"Title"}, 
       canPage:false); 
%> 
<%= grid.GetHtml(columns: grid.Columns(
      grid.Column(format: (item) => Html.ActionLink("Edit", "Edit", new { id = item.ID })), 
      grid.Column("ID"), 
      grid.Column("ISP"), 
      grid.Column("ABONNEMENT"), 
      grid.Column("MODE"), 
      grid.Column("SETUPFEE"), 
      grid.Column("MONTHLYFEE")) 
      ) %> 
</div> 

+0

非常想知道是否有辦法強制webgrid發佈而不是獲得排序和分頁。 – Grubsnik 2011-02-22 14:23:14

+0

如果你的表不是太大,也許你可以使用jquery.tablesorter在客戶端排序? – 2011-05-12 16:42:21

回答

1

我不知道爲什麼DESC不switchign到ASC。我有一個類似的例子,它工作得很好。使用ajax容器(ajaxUpdateContainerId)。這可能會有所幫助,如果沒有其他解決方案,它可以解決您在使用httpget請求時遇到的問題,從而維護您的搜索結果。這是我的:(我使用剃鬚刀,但應該很容易轉換)。

只需添加新的屬性:ajaxUpdateContainerId: 「div_name

裹電網與一個div有div_name的ID

@{ 
var grid = new System.Web.Helpers.WebGrid(Model.SubscriptionList, canPage:false, ajaxUpdateContainerId: "grid"); 
} 
<div id="grid"> 
    @grid.GetHtml(columns: grid.Columns( 
    grid.Column(format:(item) => Html.ActionLink("Edit", "Edit", new { id=item.Id })), 
    grid.Column("ISP"), 
    grid.Column("ABONNEMENT"))) 
</div> 

祝你好運,希望它幫助!

24

發生這種情況的原因是網格列名稱必須與您的字段或屬性相對應。在網格標題中生成網址的方法將網址查詢字符串中的「排序」與有界列和網格列名進行比較。他們三人必須是一樣的。如果您的列名稱的定義配置不正確,則URL將無法正確生成。

無論如何..這裏是一些正確定義列名的例子。

在這裏,我們有樣域類顯示

public class Person 
{ 
    public string FirstName; 
    public string LastName; 
    public Address LivesIn; 
} 

public class Address 
{ 
    public string Country; 
    public string City; 
} 

現在讓顯示列表

使用列名作爲字段

grid.Column("FirstName"), 
grid.Column("LastName"), 
grid.Column("LivesIn.City"), 
grid.Column("LivesIn.Country") 

...所有列具有正確的排序網址

如果您在列名中輸入錯字,您會得到異常

grid.Column("FirstName"), 
grid.Column("MyLastName"), <-- this throws exception 
grid.Column("LivesIn.City"), 
grid.Column("LivesIn.Country") 

但是你可以使用格式,不會有例外拋出

grid.Column("FirstName"), 
grid.Column("MyLastName", format: item => item.LastName</text>), 
grid.Column("LivesIn.City"), 
grid.Column("LivesIn.Country") 

...但列MyLastName排序網址會壞!所有的時間sortDir = ASC

你需要用良好的列名具有適當的分類URL和自定義格式等等...

grid.Column("FirstName"), 
grid.Column("LastName", format: item => item.LastName), 
grid.Column("LivesIn.City"), 
grid.Column("LivesIn.Country") 

...一切正常

如何複雜類型?

grid.Column("FirstName"), 
grid.Column("LastName"), 
grid.Column("LivesIn.MyNonExistingField", format: item => item.LivesIn.City), 
grid.Column("LivesIn.Country") 

....哇......一切都確定..這是錯誤..列「LivesIn.MyNonExistingField」的孩子有適當的分類網址。

好的......如果我們不想公開我們的域名結構會怎樣。然後,我們需要結合

var grid = new WebGrid(persons, columnNames: new [] { "Foo" }); 
-- or -- 
grid.Bind(persons, columnNames: new [] { "Foo" }); 

grid.Column("Foo", format: item => item.FirstName), 
grid.Column("LastName"), 
grid.Column("LivesIn.MyNonExistingField", format: item => item.LivesIn.City), 
grid.Column("LivesIn.Country") 

過程中添加的列名的列表。現在美孚列有適當的分類網址

但仔細!還有一個錯誤。

如果我們添加手動列名來綁定,那麼所有列將被跳過,直到找到手動列。例如:

var grid = new WebGrid(persons, columnNames: new [] { "Foo" }); 
-- or -- 
grid.Bind(persons, columnNames: new [] { "Foo" }); 

grid.Column("FirstName"), 
grid.Column("Foo", format: item => item.LastName), 
grid.Column("LivesIn.MyNonExistingField", format: item => item.LivesIn.City), 
grid.Column("LivesIn.Country") 

...排序列「姓」的URL將無法正確生成... sortDir = ASC所有的時間......解決這個插件也有「姓」作爲列名這樣的:

var grid = new WebGrid(persons, columnNames: new [] { "FirstName", "Foo" }); 
-- or -- 
grid.Bind(persons, columnNames: new [] { "FirstName", "Foo" }); 

grid.Column("FirstName"), 
grid.Column("Foo", format: item => item.LastName), 
grid.Column("LivesIn.MyNonExistingField", format: item => item.LivesIn.City), 
grid.Column("LivesIn.Country") 

@Kohen

在你的代碼刪除COLUMNNAMES這裏

var grid = new System.Web.Helpers.WebGrid(Model.SubscriptionList, 
      columnNames: new List<string>(){"Title"}, 
      canPage:false); 

...或添加有一個你的列名如「ID」,「ISP」等

+0

哇!很好的答案。 – 2011-12-30 18:22:20

2

我一直在考慮解決問題的辦法,我找到了一個。

我在查詢字符串集合中注入了一個額外的參數。這樣我可以將搜索過濾器放入查詢字符串中。

通常查詢字符串集合是隻讀的,但我發現了一些代碼來解決這個問題。

守則參數添加到查詢字符串:

  public static void Add(string name, string value) 
      { 
        NameValueCollection qs = System.Web.HttpContext.Current.Request.QueryString; 
        qs = (NameValueCollection)System.Web.HttpContext.Current.Request.GetType().GetField("_queryString", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(System.Web.HttpContext.Current.Request); 
        PropertyInfo readOnlyInfo = qs.GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
        readOnlyInfo.SetValue(qs, false, null); 
        qs[name] = value; 
        readOnlyInfo.SetValue(qs, true, null); 
      } 

新控制器代碼:

  public ActionResult Index(string SearchFilter) 
      { 
        // check querystring search 
        if (string.IsNullOrEmpty(SearchFilter) && !String.IsNullOrEmpty(Request.QueryString["search"])) 
          SearchFilter = Request.QueryString["search"]; 

        var model = new Models.SubscriptionListModel { SearchFilter = SearchFilter }; 

        if (string.IsNullOrEmpty(SearchFilter)) 
        { 
          model.SubscriptionList = _subscriptionHandler.ReadWhereIdLessThanThousand(); 
        } 
        else 
        { 
          // add search filter to the querystring 
          Common.QueryString.Add("search", SearchFilter); 
          model.SubscriptionList = _subscriptionHandler.ReadWhereContains(SearchFilter); 
        } 

        if (Request.IsAjaxRequest()) 
        { 
          return View("SubscriptionList", model); 
        } 
        else 
        { 
          return View("Index", model); 
        } 
      } 

如果任何人有一個更清潔的解決方案來解決這個問題,建議仍然歡迎:-)

1

我通過設置'SortColumn'prop來解決MVC 4中的這個問題。電網到「排序」查詢字符串PARAM:價值的

grid = new WebGrid(... 
grid.Bind(Model... 

grid.SortColumn = this.Request.QueryString["sort"]; 

@grid.GetHtml(columns:... 

我注意到了,在我的模型「SortColumn」道具「日期」列。被設置爲默認排序列的名稱,無論「排序」查詢字符串參數的值...