[英]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.