微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – asp.net mvc 3 webgrid排序依然?sortdir = ASC

我在asp.net mvc中尝试了几个网格.
微软有一个网格也知道在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>

解决方法

这是因为网格列名称必须与您的字段或属性对应.在网格标题生成网址的方法将“排序”与url查询字符串与有界列和网格列名称进行比较.其中三个必须是一样的.如果您的列名称的定义配置不正确,则不会正确生成该URL.

无论如何..这里有一些正确定义的列名称的例子.

这里我们要显示示例域类

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);

…或添加所有的列名称,如“ID”,“ISP”等

原文地址:https://www.jb51.cc/aspnet/249959.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐