【问题标题】:WebGrid - Sorting by navigation property's field when null referenceWebGrid - 空引用时按导航属性的字段排序
【发布时间】:2014-12-09 19:28:40
【问题描述】:

我使用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 包,但没有帮助。

有什么想法吗?

【问题讨论】:

  • 例如,您只能将用户不为空的项目传递给视图。
  • 我也需要没有用户出现的行;作为空白。
  • 请检查我的回答,这对你有意义吗?

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


【解决方案1】:

为请求添加扩展方法/部分类的属性,如 ActualOrEmptyUserName。 在 Getter 中,您可以检查用户是否已填充,如果是则返回 user.name 否则返回 ""。

在您的 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)通过您的列表,并检查用户的值,如果它为空,则为该值创建一个空用户并用 string.empty 或“”填充名称。

这个迭代可以在你的控制器或视图的上部。这取决于你。

但我猜你不能像你尝试的那样使用格式。

【讨论】:

  • 我喜欢第一个选项的外观。我很快就会尝试这个。如果它工作正常,我会接受它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2013-04-17
  • 2019-08-05
  • 2010-11-19
相关资源
最近更新 更多