微软有一个网格也知道在mvc 3的预发行,所以我以为我会尝试一个.
基本功能很容易实现,但是当涉及到排序时,我遇到了一些问题.
网格通过URL处理其排序.在url中,您可以按以下方式排序列和排序方向:
?sortdir = ASC&安培;排序= ABONNEMENT
现在您可以期待在对某列进行排序后,该列上的sortdir querystring将更改为?sortdir = DESC
但它没有.它保持?sortdir = ASC.
有人知道这是一个bug还是一个功能,以及如何解决这个问题?
另一个非常讨厌的事情:如果我点击排序链接,httpget请求就完成了.
因为这样我松动我的模型.因为页面上有可能过滤网格(搜索功能),我想在模型中保留这个.
这将是一个更容易&在我看来,将这些数据放在模型状态,比将其存储在会话状态更清晰的解决方案.
是否可以改变排序标题链接的行为,以便执行http文章?
有什么想法或想法吗?
Tnx的帮助.
greetz,柯恩
视图的代码如下:
<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>
解决方法
无论如何..这里有一些正确定义的列名称的例子.
这里我们要显示示例域类
public class Person { public string FirstName; public string LastName; public Address LivesIn; } public class Address { public string Country; public string City; }
现在让我们显示List
使用您的列名称作为字段
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.Country")
…但排序的列MyLastName的URL将是BAD !!!所有的时间sortDir = ASC
您需要使用良好的列名称具有适当的排序网址和自定义格式,所以…
grid.Column("FirstName"),grid.Column("LastName",format: item => item.LastName),grid.Column("LivesIn.Country")
… 一切都好
复杂类型怎么样?
grid.Column("FirstName"),grid.Column("LivesIn.MyNonExistingField",format: item => item.LivesIn.City),grid.Column("LivesIn.Country")
….哇…一切都好了..这是一个小孩的bug ..列“LivesIn.MyNonExistingField”有适当的排序url.
好吧,如果我们不想公开我们的域结构怎么办?然后我们需要在绑定期间添加列名称列表
var grid = new WebGrid(persons,columnNames: new [] { "Foo" }); -- or -- grid.Bind(persons,columnNames: new [] { "Foo" }); grid.Column("Foo",format: item => item.FirstName),grid.Column("LivesIn.Country")
..现在Foo列有适当的排序url
但小心!!!还有另一个错误.
如果我们将手动列名称添加到绑定中,那么将跳过所有列,直到找到手动列.示例:
var grid = new WebGrid(persons,columnNames: new [] { "Foo" }); grid.Column("FirstName"),grid.Column("Foo",grid.Column("LivesIn.Country")
…排序URL列“FirstName”将不会正确生成… sortDir = ASC所有的时间…修复此添加一个“FirstName”作为列名称,如下所示:
var grid = new WebGrid(persons,columnNames: new [] { "FirstName","Foo" }); -- or -- grid.Bind(persons,"Foo" }); grid.Column("FirstName"),grid.Column("LivesIn.Country")
@Kohen
var grid = new System.Web.Helpers.WebGrid(Model.SubscriptionList,canPage:false);