【问题标题】:Not set to an instance of an object? [duplicate]未设置为对象的实例? [复制]
【发布时间】:2021-08-25 12:38:15
【问题描述】:

当我尝试添加评论时,我得到了返回。我真的不明白为什么我从要创建票证的地方创建错误?

这是我的错误来自的控制器,它指向obj.Ticket.Ticket_Id == 0

public IActionResult Create(TicketVM obj)
{
    if (obj.Ticket.Ticket_Id == 0)
    {
        _db.Tickets.Add(obj.Ticket);
    }
    else
    {
        _db.Tickets.Update(obj.Ticket);
    }
}

这是我收到的消息:

System.NullReferenceException: '对象引用未设置为对象的实例。'

WebApplication20.Models.TicketVM.Ticket.get 返回 null。

我尝试创建一个应用程序,我可以在其中创建一个项目对象,然后您应该能够为其创建票证,并且在我的票证中,我应该能够为特定票证制作 cmets。为了能够做到这一点,我在项目 --> 票证之间创建了一对多关系,然后在票证之间创建了一对多关系 --> 评论。

这就是我的票证控制器,我可以在其中创建更新和删除票证:

[Authorize]
public class TicketController : Controller
{
    private readonly ApplicationDbContext _db;

    public TicketController(ApplicationDbContext db)
    {
        _db = db;
    }

    public IActionResult Index()
    {
        IEnumerable<Ticket> objList = _db.Tickets;

        foreach (var obj in objList)
        {
            obj.Project = _db.Projects.FirstOrDefault(u => u.Project_Id == obj.Project_Id);
        }

        return View(objList);
    }

  
   /**This is the view i want to create my operation on**/

    public IActionResult Info(int id)
    {
        CommentVM t = new CommentVM();
        t.Ticket = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == id);
        t.Comments = _db.Commenents.Where(f => f.Ticket_Id == id);
        return View(t);
    }

    // Create

    public IActionResult Create(int? id)
    {

        TicketVM obj = new TicketVM();
        obj.ProjectList = _db.Projects.Select(i => new SelectListItem
        {
            Text = i.Name,
            Value = i.Project_Id.ToString()
        });
        if (id == null)
        {
            return View(obj);
        }

        // Status List
        #region
        List<SelectListItem> statusList = new List<SelectListItem>();
        statusList.Add(new SelectListItem()
        {
            Value = "Open",
                Text = "Open"
        });

        statusList.Add(new SelectListItem()
        {
            Value = "Closed",
            Text = "Closed"
        });

    #endregion
    // Status List End

        if (obj == null)
        {
            return NotFound();
        }

        obj.Ticket = _db.Tickets.FirstOrDefault(u => u.Ticket_Id == id);
        obj.StatusList = statusList;

        return View(obj);
    }

    /**This is the controller where i get my error from:**/

    // POST Create/Update
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create(TicketVM obj)
    {
        if (obj.Ticket.Ticket_Id == 0)
        {
            _db.Tickets.Add(obj.Ticket);
        }
        else
        {
            _db.Tickets.Update(obj.Ticket);
        }
            
        _db.SaveChanges();
        return RedirectToAction(nameof(Index));
    }


    // Delete
    public IActionResult Delete(int? id)
    {
        var dbObj = _db.Tickets.FirstOrDefault(u => u.Ticket_Id == id);
        _db.Tickets.Remove(dbObj);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Comments(CommentVM obj)
    {
        if(ModelState.IsValid) 
        {
            _db.Commenents.Add(obj.Comment);
            _db.SaveChanges();
            return RedirectToAction(nameof(Index));
        }

        return View();
    }
}

在底部我创建了一个注释控制器,我希望能够将 cmets 添加到数据库中。当我尝试从属于 Ticket 中的 InfoController 的视图中发表评论时,我收到一条警报,提示我的 TicketController 中的 Create / POST 中存在错误,其中显示“对象引用未设置为一个东西。'我完全不明白为什么我从 Creaste / POST 票证中收到错误消息?

这就是我的信息视图的样子

@model WebApplication20.ViewModel.CommentVM

@{
    Layout = "_Dashboard";
    var title = "About Ticket";
}

<html>
<body id="page-top">

    <div class="card mx-auto" style="width: 18rem;">
        <div class="card-header">
            <h4><strong>Ticket Status</strong></h4> Created @Model.Ticket.TicketCreated
        </div>
        <ul class="list-group list-group-flush">
            <li class="list-group-item"><strong>Name:</strong>@Model.Ticket.TicketName </li>
            <li class="list-group-item"><strong>Descripton: @Model.Ticket.TicketDescription</strong></li>
            <li class="list-group-item"><strong>Priority:</strong> @Model.Ticket.TicketPriority</li>
            <li class="list-group-item"><strong>Type:</strong> @Model.Ticket.TicketType</li>
            <li class="list-group-item"><strong>Status:</strong> @Model.Ticket.TicketStatus</li>
        </ul>
    </div>

    <div class="card shadow mx-auto m-3" style="width: 42rem;">
        <div class="card-header">
            <h4><strong>Comments</strong></h4>
        </div>

        <div class="row">
            <div class="col-md-4 p-4">
                <form asp-action="Comments">
                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                    <div class="form-group">
                        <label asp-for="Message" class="control-label"></label>
                        <input asp-for="Message" class="form-control" />
                        <span asp-validation-for="Message" class="text-danger"></span>
                    </div>

                    <div class="form-group">
                        <input type="submit" value="Submit" class="btn btn-primary" />
                    </div>
                </form>
            </div>
        </div>

        @*TABLE*@

        <div class="row">

            <!-- Area Chart -->
            <div class="col-xl-8 col-lg-7">
                <div class="card shadow mb-4">
                    <!-- Card Header - Dropdown -->
                    <div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
                        <h6 class="m-0 font-weight-bold text-primary">Current Comments</h6>

                    </div>
                    @if (Model.Comments.Count() > 0)
                    {
                        <table class="table table-bordered table-striped" style="width:100%">
                            <thead>
                                <tr>
                                    <th>
                                        Message
                                    </th>
                                    <th>
                                        Submitter
                                    </th>
                                    <th>
                                        Created
                                    </th>
                                </tr>
                            </thead>
                            <tbody>
                
                                @foreach (var comment in Model.Comments)
                                {
                                    <tr>

                                        <td width="10%">
                                            @comment.Message
                                        </td>
                                        <td width="10%">
                                        </td>
                                        <td width="10%">
                                            @comment.Created
                                        </td>



                                    </tr>
                                }
                            </tbody>
                        </table>
                    }
                    else
                    {
                        <h5 class="text-secondary m-1">There are no comments for this ticket yet..</h5>
                    }


                </div>
            </div>
        </div>
        @*END TABLE*@

    </div>
    

    <div class="text-center p-3">
        <a asp-controller="Ticket" asp-route-Id="@Model.Ticket.Ticket_Id" asp-action="Create" class="btn btn-success btn-lg text-white w-30">Edit</a>
        <a asp-controller="Ticket" asp-route-Id="@Model.Ticket.Ticket_Id" asp-action="Delete" class="btn btn-danger btn-lg text-white w-30">Delete</a>
    </div>
    <!-- Bootstrap core JavaScript-->
    <script src="/TemplateInfo/vendor/jquery/jquery.min.js"></script>
    <script src="/TemplateInfo/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>

    <!-- Core plugin JavaScript-->
    <script src="/TemplateInfo/vendor/jquery-easing/jquery.easing.min.js"></script>

    <!-- Custom scripts for all pages-->
    <script src="/TemplateInfo/js/sb-admin-2.min.js"></script>

</body>
</html>

【问题讨论】:

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


    【解决方案1】:

    您是否检查过 TicketVM obj 是否有数据。我认为您的绑定不起作用并且 TicketVM obj 设置为 null。下断点检查一下

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 2010-09-12
      • 1970-01-01
      • 2018-09-25
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多