ASP.net MVC LINQ 空引用异常 [重复]

Posted

技术标签:

【中文标题】ASP.net MVC LINQ 空引用异常 [重复]【英文标题】:ASP.net MVC LINQ null reference exception [duplicate] 【发布时间】:2016-01-09 13:56:26 【问题描述】:

当我尝试从表中查看实际登录用户的数据时出现空引用异常 - Klient_has_sklep 并且如果该用户未使用 Sklep 表签名。 当我查看使用 Sklep 表签名的用户的数据时,一切正常。

我认为问题出在带有 viewModel

的控制器中

这是我的控制器

public ActionResult Index(int? id)

    var viewModel = new Klient_has_SklepIndexData();
    viewModel.Klients = db.Klients

  .OrderBy(i => i.Nazwisko);        
    UserManager UM = new UserManager();
    int idZalogowanego = UM.GetUserID(User.Identity.Name);
    ViewBag.idzal = idZalogowanego;

    viewModel.Klient_has_Skleps = viewModel.Klients.Where(i => i.SYSUserID == idZalogowanego).Single().Klient_has_Sklep;

    return View(viewModel);

这是我的看法

@model Sklepy.Models.ViewModel.Klient_has_SklepIndexData

@
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";

<h2>@ViewBag.idzal.</h2>
<h2>Twoje zniżki w sklepach</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>asd</th>
    </tr>


@if (Model != null)

    @foreach (var item in Model.Klient_has_Skleps)
    
        <tr>
            <td>@item.Znizka1</td>

        </tr>
    

</table>

这是我的模特

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sklepy.Models.DB;

namespace Sklepy.Models.ViewModel

    public class Klient_has_SklepIndexData
    
            public IEnumerable<Klient> Klients  get; set; 
            public IEnumerable<Klient_has_Sklep> Klient_has_Skleps get; set;
    

客户端类代码

 public partial class Klient

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Klient()
    
        this.Klient_has_Sklep = new HashSet<Klient_has_Sklep>();
    

    public int KlientID  get; set; 
    public int SYSUserID  get; set; 
    public string Imię  get; set; 
    public string Nazwisko  get; set; 
    public string Adres  get; set; 
    public string Telefon  get; set; 
    public string Email  get; set; 

    public virtual SYSUser SYSUser  get; set; 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Klient_has_Sklep> Klient_has_Sklep  get; set; 

【问题讨论】:

您究竟在哪里得到空异常?在行动中还是在视野中? 在控制器中这一行 viewModel.Klient_has_Skleps = viewModel.Klients.Where(i => i.SYSUserID == idZalogowanego).Single().Klient_has_Sklep; 【参考方案1】:

如下所示创建您的 ViewModel。我进行了修改以使用List 进行默认初始化。

public class Klient_has_SklepIndexData

    public IList<Klient> Klients  get; set; 
    public IList<Klient_has_Sklep> Klient_has_Skleps  get; set; 

    public Klient_has_SklepIndexData()
    
        Klients = new List<Klient>();
        Klient_has_Skleps = new List<Klient_has_Sklep>();
    

还有你的操作代码。

    public ActionResult Index(int? id)
    
        var viewModel = new Klient_has_SklepIndexData();
        viewModel.Klients = db.Klients
                            .OrderBy(i => i.Nazwisko).ToList();        
        UserManager UM = new UserManager();
        int idZalogowanego = UM.GetUserID(User.Identity.Name);
        ViewBag.idzal = idZalogowanego;

        var skelp = viewModel.Klients.FirstOrDefault(i => i.SYSUserID == idZalogowanego);

        if(skelp != null)
            if(skelp.Klient_has_Sklep != null)
                viewModel.Klient_has_Skleps = skelp.Klient_has_Sklep.ToList();
            
        

        return View(viewModel);
    

【讨论】:

我使用了复制粘贴的方法。还是报错Cannot convert from 'System.Collections.Generic.ICollection&lt;Sklepy.Models.DB.Klient_has_Sklep&gt;' to 'Sklepy.Models.DB.Klient_has_Sklep' 我先有数据库,所以看起来像这样:link 这一行返回错误:Only assignment, call, increment, decrement, and new object expressions can be used as a statement 编辑了我的帖子,添加了 Klient 类代码。 还是不行在同一行:Cannot implicitly convert type 'System.Collections.Generic.ICollection&lt;Sklepy.Models.DB.Klient_has_Sklep&gt;' to 'System.Collections.Generic.IList&lt;Sklepy.Models.DB.Klient_has_Sklep&gt;'. An explicit conversion exists (are you missing a cast?) System.InvalidOperationException 在同一行。

以上是关于ASP.net MVC LINQ 空引用异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

UrlHelper 类在 Asp.net mvc 中引发空异常

ASP.NET Core MVC 在引用数据库连接时生成异常错误

ASP.NET MVC 4 ScriptBundle 返回空

csharp ASP.NET MVC和LINQ

自坑实录 - Asp.net MVC中无法使用@Ajax.BeginForm问题解决

asp.net的MVC中使用office word 2003的com组件问题!!求助!急!