首页 > 解决方案 > POST 后如何返回同一页面?

问题描述

我想通过我拥有的视图对票证发表评论,为此我创建了一个带有 post 属性的评论控制器。但是,当我使用评论控制器执行我的过程时,我希望它返回到原始视图,在该视图中我拥有关于我想要评论的所有数据。但我无法得到它并以任何方式工作。它似乎无法找到返回票证 ID 本身的方法。

我已经在我的控制器中尝试了这个 return 语句return RedirectToAction(nameof(Info)); ,但我只是收到了这个错误消息System.NullReferenceException: 'Object reference not set to an instance of an object. WebApplication20.ViewModel.CommentVM.Ticket.get returned null.

这是我认为发生错误的地方 @Model.Ticket.TicketCreated

任何人都知道在使用我的后控制器后我应该如何返回到相同的视图?

这是我的看法

@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 HERE IS THE ERROR MESSAGE
        </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: </strong> @Model.Ticket.TicketDescription</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 method="post" asp-controller="Ticket" asp-action="Comments" asp-route-Id="@Model.Ticket_Id" >
                    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                    <div class="form-group">
                        <label asp-for="Comment.Message" class="control-label"></label>
                        <input type="hidden" asp-for="Comment.Ticket_Id" value="@Model.Comment.Ticket_Id" />
                        <span asp-validation-for="Comment.Message" class="text-danger"></span>
                        <textarea asp-for="Comment.Message" rows="5" style="resize:none;" class="form-control"></textarea>
                        <button type="submit" btn btn-sucess>Submit</button>
                    </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>

控制器 我的视图所在的信息控制器和我进行评论过程的评论控制器

public IActionResult Info(int id)
        {

            CommentVM t = new CommentVM { Comment = new Comments { Ticket_Id = id } };

            t.Ticket = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == id);
            t.Comments = _db.Commenents.Where(f => f.Ticket_Id == id);
            return View(t);

         }


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

            }

            return View(obj);
        }

标签: c#asp.netasp.net-mvc

解决方案


Object reference not set to an instance of an object表示您的对象为空。

然后您需要将 Id 发送到您的视图,因此您必须使用RedirectToAction并传递 Id (Ticket_Id)。

例子:

CommentVM t = new CommentVM { Comment = new Comments { Ticket_Id = id } };

t.Ticket = _db.Tickets.FirstOrDefault(t => t.Ticket_Id == id);

if (t.Ticket == null)
{
   // if it doesn't find the Id in your database, at least it will return the instantiated object (Id will be 0)
    t.Ticket = new Ticket();
}

t.Comments = _db.Commenents.Where(f => f.Ticket_Id == id);

return RedirectToAction("Info", new { id = obj.Ticket_Id });

推荐阅读