1

我有一个视图,它使用Grid.MVC来显示所需的用户属性。我的控制器在下面使用用户[MemberOrgID]或[SponsorOrgID]查找与该用户特定ID相关的所有相关组织/赞助商信息(用户将拥有其他用户的ID,从未同时拥有两个ID):在MVC5视图中处理/防止NullReferenceException?

// GET: Admin/UserManagement 
    public async Task<ActionResult> Index() 
    { 
     ViewBag.headerTitle = "User Management"; 
     ViewBag.showCreateButton = true; 
     ViewBag.createUrl = "/Admin/UserManagement/Create"; 
     ViewBag.createText = " Create a New User"; 
     List<ApplicationUser> model = UserManager.Users.ToList(); 
     foreach (ApplicationUser user in model) 
     { 
      if (user.MemberOrgId != null) 
      { 
       user.Organization = db.MemberOrganizations.Find(user.Organization); 
      } 
      //else 
      //{ 
      // user.Organization.Name = " "; 
      //} 

      if (user.SponsorOrgId != null) 
      { 
       user.Sponsor = db.SponsorOrganizations.Where(o => o.Id == user.SponsorOrgId).FirstOrDefault(); 
      } 
      //else 
      //{ 
      // user.Sponsor.Name = " "; 
      //} 
     } 
     return View(model); 
    } 

由于我的第一个用户有一个赞助商的ID,这是我能即时窗口中看到在调试中VS2013:

?user.Sponsor 
    {System.Data.Entity.DynamicProxies.SponsorOrganizations_F2A27693F33AFF36C814F6FFA2CE63AD656938244F599B7D1AB2ED80CC26EF9A} 
    [System.Data.Entity.DynamicProxies.SponsorOrganizations_F2A27693F33AFF36C814F6FFA2CE63AD656938244F599B7D1AB2ED80CC26EF9A]: {System.Data.Entity.DynamicProxies.SponsorOrganizations_F2A27693F33AFF36C814F6FFA2CE63AD656938244F599B7D1AB2ED80CC26EF9A} 
    City: null 
    Country: null 
    Enabled: true 
    FacebookUrl: "https://www.facebook.com/sponsor1" 
    Id: 1 
    LogoSrc: "Sponsor1.jpg" 
    Name: "Sponsor1" 
    OwnerId: "1d720c20-a508-4880-a5e6-80af5f2f8caf" 
    OwnerName: "Sponsor Primary" 
    ProfilePictureUrl: "sponsorprofilepicture/Sponsor1.jpg" 
    SponsorServiceCategory: Count = 11 
    State: null 
    TwitterUrl: "https://twitter.com/sponsor1" 
    Users: Count = 0 
    WebsiteUrl: "http://www.sponsor1.com" 

我有一个NullReference问题但是当视图被加载(如下图)代码o.Organization.Name被标记为NullReferenceException(我添加了一个try catch只是为了让事情变得更友好一点,让其余的查看负载):

@using GridMvc.Html 
@model IEnumerable<PROJECTS.Models.ApplicationUser> 

@{ 
    ViewBag.Title = "View Users"; 
    Layout = "~/Areas/Admin/Views/Shared/_LayoutAdmin.cshtml"; 

} 

<div class="overflowPrevention"> 
    <!-- Grid.MVC Code --> 
    <div> 
     @*Images in Columns: https://gridmvc.codeplex.com/discussions/440977*@ 
@try 
{ 
     @Html.Grid(Model).Columns(columns => 
     { 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => Html.ActionLink("Edit", "Edit", "UserManagement", new { id = o.Id }, null)).SetWidth(15); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Name).Titled("Name").Sortable(true).Filterable(true).SetWidth(100); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Position).Titled("Position").Sortable(true).Filterable(true).SetWidth(50); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Email).Titled("Email").Sortable(true).Filterable(true).SetWidth(100); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.EmailConfirmed.ToString()).Titled("Confirmed").Sortable(true).Filterable(true).SetWidth(100); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.MemberOrgId.ToString()).Titled("MemOrg.").Sortable(true).Filterable(true).SetWidth(25); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Organization.Name.ToString()).Titled("MemOrg.").Sortable(true).Filterable(true).SetWidth(25); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.SponsorOrgId.ToString()).Titled("Sponsor").Sortable(true).Filterable(true).SetWidth(25); 
      columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Sponsor.Name.ToString()).Titled("Sponsor").Sortable(true).Filterable(true).SetWidth(25); 
     }).WithPaging(5) 
} 
catch (NullReferenceException ex) 
{ 
    return; 
} 
    </div> 
</div> 

有没有人对我怎么可能会否定这个NullReferenceException问题的想法?用户将始终具有MemberOrganizationID或SponsorID,这意味着o.Organization.Name将具有值或o.Sponsor.Name意志,但从来都不是。我试图找到一种方法,使其为null或者不显示,或者在列中显示为空值。

任何帮助非常感谢!我试图通过我的控制器上的一些IF检查来否定这个问题,以及View上的一些代码,但还没有找到解决方案。

编辑:

克里斯的解决方案的工作!以下是我更新的代码段:

foreach (ApplicationUser user in model) 
     { 
      if (user.MemberOrgId != null) 
      { 
       user.Organization = db.MemberOrganizations.Where(o => o.Id == user.MemberOrgId).FirstOrDefault(); 
      } 
      if (user.SponsorOrgId != null) 
      { 
       user.Sponsor = db.SponsorOrganizations.Where(o => o.Id == user.SponsorOrgId).FirstOrDefault(); 
      } 
     } 
     return View(model); 

     columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.MemberOrgId.ToString()).Titled("MemOrgID").Sortable(true).Filterable(true).SetWidth(25); 
     columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Organization == null ? "" : o.Organization.Name.ToString()).Titled("MemOrg Name.").Sortable(true).Filterable(true).SetWidth(25); 
     columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.SponsorOrgId.ToString()).Titled("SponsorID").Sortable(true).Filterable(true).SetWidth(25); 
     columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => o.Sponsor == null ? "" : o.Sponsor.Name.ToString()).Titled("Sponsor Name").Sortable(true).Filterable(true).SetWidth(25); 
+0

我在丹尼尔之前看过那篇文章。我认为这可能会略有不同,因为我知道为什么以及如何得到'Null'异常,但我试图找到解决方法。克里斯已经找到答案:) –

回答

3

在尝试获取名称之前检查null组织吗?

columns.Add().Encoded(false).Sanitized(false) 
    .RenderValueAs(o => o.Organization == null ? "" : o.Organization.Name.ToString()) 
    .Titled("MemOrg.").Sortable(true).Filterable(true).SetWidth(25); 

如果要将它们合并到一个列中,请修改上述代码,以便在组织为空时返回赞助商名称。

+0

感谢您回复克里斯!我试过类似的东西,但是当我做'columns.Add()。Encoded(false).Sanitized(false).RenderValueAs(o => o.Organization?o.Organization.Name.ToString():“” ).Titled(“MemOrg。”)。Sortable(true).Filterable(true).SetWidth(25);'o =>'后的'o.Organization'被标记为:“不能隐式转换类型'PROJECT。 Models.MemberOrganizations'改为'bool'“。 –

+0

对不起,javascript悄悄地通过。这个例子已被修改 –

+0

这是个窍门,非常感谢Chris!这正是我想要做的,但是有相当长的时间来确定语法。 –