2010-12-23 63 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”道具“日期”列。被设置为默认排序列的名称,无论“排序”查询字符串参数的值...