问题是该方法不会像标题所说的那样收到id。我尝试通过编写 console.writeLine(orderId); 检查并确保这是问题所在。无论对象是什么,它总是返回 0。
我之前遇到过类似的问题,我只需向该问题添加一个 IActionResult 方法,因此我也为此添加了一个方法,但这还不够。我在表单中有一个隐藏的输入字段,其作用就像一个按钮,并且我确保不会错过将其链接到该方法的 asp 操作。我知道该方法正在连接但 id 为空的另一个原因是因为该方法的编写方式是,如果 id 为空,那么它们应该只转到索引页的顶部,这正是它的作用。该方法的重点是能够改变状态。
这是控制器中的方法,Orders 是模型类的名称
public IActionResult Index(int orderId, OrderStatus nyStatus)
{
var andraInfo = new Orders();
andraInfo.Id = orderId;
andraInfo.Status = nyStatus;
return View(andraInfo);
}
//-----------------------------------
public IActionResult AndraStatus(int orderId, OrderStatus nyStatus)
{
Console.WriteLine(orderId);
var order = _context.Orders.Find(orderId);
//var order = _context.Orders.FirstOrDefault(o => o.Id == orderId);
// Kontrollera om ordern finns
if (order != null)
{
// Uppdatera statusen på ordern
order.Status = nyStatus;
// Spara ändringarna i databasen
_context.Update(order);
_context.SaveChanges();
}
return RedirectToAction("Index", "Home");
}
查看索引页面
@foreach (var hat in Model)
{
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title">Namn på hatten: @hat.Title</h5>
@foreach (var order in hat.HatsOrders)
{
<div class="card mb-3 ">
<div class="card-body">
@if (User.Identity.IsAuthenticated)
{
<form asp-controller="Order" asp-action="AndraStatus" method="post">
<div class="form-group">
<label for="nyStatus">Välj ny status:</label>
<select class="form-control" id="nyStatus" name="nyStatus">
@foreach (var status in Enum.GetValues(typeof(OrderStatus)))
{
<option value="@status">@status</option>
}
</select>
</div>
@* <input type="hidden" name="orderId" value="@order.Id" />
<button type="submit" class="btn btn-primary">Uppdatera status</button> *@
<form method="post" >
<input type="hidden" name="orderId" value="@order.Id">
<input type="submit" class="btn btn-primary" value="Uppdatera status" >
</form>
</form>
}
else
{
<p class="card-text">Status: @order.Orders.Status</p>
}
@if (order.Orders.UserId is null)
{
<p>Det finns ingen som är ansvarig för hatten</p>
@if (User.Identity.IsAuthenticated)
{
<form asp-controller="Home" asp-action="LaggTillAnsvarig" asp-route-id="@order.Orders.UserId">
<button type="submit" class="btn btn-primary">Markera mig som ansvarig</button>
</form>
}
}
else
{
<p class="card-text">Ansvarig: @order.Orders.Users.UserName</p>
}
<hr />
<p class="card-text">Kund</p>
<p class="card-text">Förnamn: @order.Orders.Customers?.Firstname</p>
<p class="card-text">Efternamn: @order.Orders.Customers?.Lastname</p>
</div>
</div>
}
</div>
</div>
}
谢谢顺便说一句
将数据发布到服务器时最好使用正确的视图模型。我将首先重构代码以使用类似于以下方法的方法:
public class OrderViewModel
{
public int orderId { get; set; }
public OrderStatus nyStatus { get; set; }
}
[HttpPost]
public IActionResult AndraStatus(OrderViewModel viewModel)
{
var order = _context.Orders.Find(viewModel.orderId);
}
这将确保您的表单控件绑定到视图模型。