-1

I get this returned when I try to add a comment. I can not really understand why I get error from create where i want to create a ticket ?

This is the contoller where my error comes from and it points on 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);
    }
}

This is the message i get:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

WebApplication20.Models.TicketVM.Ticket.get returned null.

I try to create an application where I can create a project object that then you should be able to create tickets for, and inside my tickets i should be able to make comments for the specific ticket. To be able to do that, I have created a one to many relationship between project --> ticket then a one to many relationship between ticket --> comment.

This is what my ticket controller where im able to create update and delete Tickets look like:

[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();
    }
}

At the bottom I have created a comment controller where I want to be able to add comments to the database. When I try to make a comment from my view that belongs to the InfoController in Ticket, I get an alarm that there is an error in my TicketController from Create / POST where it says 'Object reference not set to an instance of an object.' I do not understand at all why I get an error from Creaste / POST ticket?

This is what my Info view looks like

@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>
Joel Coehoorn
  • 399,467
  • 113
  • 570
  • 794
Daniel
  • 369
  • 2
  • 4
  • 9

1 Answers1

0

have you checked that TicketVM obj has data. I think your binding is not working and TicketVM obj is set to null. put a breakpoint and check it

Asif Ali
  • 123
  • 7