c# - 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);
}
解决方案
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 });
推荐阅读
- javascript - 将 Markdown 文件动态导入 Svelte 引发 404 错误
- android - StateFlow 汇集在一个协程中
- mysql - 获取总和小于或等于数据集中值的记录
- node.js - Sequelize + postgres,如何计算连接池大小?
- java - 如何在基于 Java 的 Android 应用程序中实现 Datastore?
- python - Python mypy 类型错误,可调用联合和可调用列表转换为可调用列表
- mysql - 在 Nodejs 中使用 SSH 连接 MySQL
- sql-server - 使用 sp_executesql 使用自动增量更新表
- javascript - 使用接口的空实例
- r - 如何在 R 中为列表中的多个值运行 ifelse 并在列表中的值与非列表中的值之间设置条件边界?