控制器中的方法不会接收来自视图页面的数据

问题描述 投票:0回答:1

问题是该方法不会像标题所说的那样收到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>
}

谢谢顺便说一句

c# asp.net asp.net-mvc asp.net-core razor
1个回答
0
投票

将数据发布到服务器时最好使用正确的视图模型。我将首先重构代码以使用类似于以下方法的方法:

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

这将确保您的表单控件绑定到视图模型。

© www.soinside.com 2019 - 2024. All rights reserved.