繁体   English   中英

Asp.net - 更新相关数据 - 提交时获取空值

[英]Asp.net - Update related data - Get null when submitting

我遇到了从带有相关数据的视图返回到控制器的问题,每次我提交带有相关数据的表单时,相关数据都会变为空。 (订单行)

我检查了 Chorme 开发工具,发现我确实将 OrderRows 发布为 row.Id,但可以在 Visual Studio 中将它们视为变量

班级

public class OrderModel
{
   [Key]
   public int Id { get; set; }
   public int OrderID { get; set; }
   public List<OrderRow> OrderRows { get; set; }
}

public class OrderRow
{   
    [Key]
    public int Id { get; set; }
    public int OrderID { get; set; }
    public int OrderRowID { get; set; }
    public OrderModel OrderModel { get; set; }

}

编辑控制器 (GET)

public ActionResult Edit(int? id)
{
    OrderModel orderModel = db.OrderModel.Where(b => b.Id == id).Include(b => b.OrderRows).FirstOrDefault();
    return View(orderModel);
}

Delivered 控制器(发布,在提交表单时激活)

public ActionResult Delivered(OrderModel orderModel, FormCollection formCollection)
{
        //db.Entry(orderModel).State = EntityState.Modified;
        //Set state to Delivered
        //db.SaveChanges();
        return RedirectToAction("Index");   
}

编辑视图

using (Html.BeginForm())
{

    @Html.LabelFor(model => model.OrderID): @Html.DisplayFor(model => model.OrderID)
    @Html.HiddenFor(model => model.OrderRows)




<div class="row">
    @Html.Label("Delivery information")
    <br />
    @Html.HiddenFor(model => model.Id, new { htmlAttributes = new { @class = "form-control" } })
    @Html.DisplayFor(model => model.Id, "", new { @class = "text-danger" })
    <br />

    @Html.HiddenFor(model => model.OrderID, new { htmlAttributes = new { @class = "form-control" } })
    @Html.DisplayFor(model => model.OrderID, "", new { @class = "text-danger" })
    <br />      
</div>

<table class="table table-striped table-bordered">
    @foreach (var row in Model.OrderRows)
    {
        <tr>
            <td>
                <input type="checkbox" value="@row.OrderRowID">
            </td>
            <td>
                @Html.HiddenFor(model => row.Id, new { htmlAttributes = new { @class = "form-control" } })
                @Html.DisplayFor(model => row.Id, "", new { @class = "text-danger" })
            </td>
            <td>
                @Html.HiddenFor(model => row.OrderID, new { htmlAttributes = new { @class = "form-control" } })
                @Html.DisplayFor(model => row.OrderID, "", new { @class = "text-danger" })
            </td>
            <td>
                @Html.HiddenFor(model => row.OrderRowID, new { htmlAttributes = new { @class = "form-control" } })
                @Html.DisplayFor(model => row.OrderRowID, "", new { @class = "text-danger" })
            </td>
            <td>
                @Html.HiddenFor(model => row.OrderModel, new { htmlAttributes = new { @class = "form-control" } })
                @Html.DisplayFor(model => row.OrderModel, "", new { @class = "text-danger" })
            </td>           
        </tr>

    }
    </table>
        <div class="form-group">
                <input type="submit" value="Mark as Delivered" formaction="/OrderModels/Delivered" class="btn btn-info" />
    </div>
}

我认为您想要的是使用 OrderRow 而不是 OrderModel。 如果我了解您的需求,您希望获得(一个)OrderModel 并包含(许多)OrderRows。 如果这是你想要的,你应该在你的视图中使用 OrderRow 作为你的模型:

OrderRow orderRows = db.OrderRow.Where(b => b.OrderModel.Id == id).ToList();

return View(orderRows );

然后你想在你的视图中更改模型:

@model IEnumberable<OrderRow>

这样,您就可以拥有所有 OrderRows,包括其 OrderModel

您的控制器被定义为public ActionResult Edit(int? id) ,这意味着它需要一个 int 类型的id值。

您不会通过它获得任何其他数据,如果您想要OrderRows的值,您需要更改表单以将其作为id提交,或者更新您的控制器以接受public ActionResult Edit(int OrderRows)

无论哪种方式,您仍然会提交很多未被控制器接收的垃圾,您只需要提交控制器定义为接受的值(如上)。 您真正想要做的是@html.BeginFrom(viewModelClass) 'ing 一个视图模型并将其与所有值一起提交给您的控制器。

例如:

Public ActionResult Edit(ViewModel model)
{
   var value = model.OrderRows
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM