WebGrid - 在空引用时按导航属性的字段排序

时间:2014-10-14 21:10:15

标签: c# asp.net-mvc entity-framework webgrid

我使用System.Web.Helpers.WebGrid来显示IEnumerable<Request>。请求具有一些导航属性。

每当我通过任何一个字段点击标题排序时,异常Object reference not set to an instance of an object.就会上升。

我用这种方式编写这种类型的列:

grid = new WebGrid(Model.Requests);

// things

@grid.GetHtml(columns: new[]{
    //[...] columns
    SDMs.Column("User.Name", "User", format: p => p.User != null ? p.User.Name : ""),
    //[...] more columns
})

请注意,我使用format参数在网格加载时设置自定义结果。

我认为这是因为没有关联User的行,但我不知道如何自定义这些情况下的行为。

我在网上发现了this,但我似乎没有在我的版本的程序集中使用此方法。我也不知道如何得到它。我尝试安装NuGet包,但没有帮助。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

为Request添加扩展方法/ partial class的属性,例如ActualOrEmptyUserName。 在Getter中,您可以检查用户是否已填充,如果是,则返回user.name else返回“”。

在你的grigview中,你将列绑定到user.name的ActualOrEmptyUserName insetad

public partial class Request
    {
        public string ActualOrEmptyUserName 
        {
            get
            {
                var username = "";
                if (Request.User != null && Request.User.Name != null)
                    username = Request.User.Name;

                return username;
            }
        }
    }

...

SDMs.Column("ActualOrEmptyUserName", "User")

另一种选择: Itarete(或linq)通过您的列表,并检查user的值,如果它为null,则为该值创建一个空用户,并使用string.empty或“”填充Name。

此操作可以在您的控制器或视图的上半部分。这取决于你。

但我猜你不能像你想的那样使用这种格式。