1

我如何将项目列表从视图发送到控制器以保存它。我相信我可以使用 Viewbag,但我真的不知道如何使用 ite 将数据从视图传递到控制器。

这就是我尝试过的我的观点

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>ProductionOrderItem</legend>


    <div class="editor-label">
        @Html.Label("ProducrionOrderNo");
    </div>
    <div class="editor-field">
        @Html.TextBox("ProductionOrderNo", ViewBag.ProductionOrder as int)

    </div>

    <div class="editor-label">
       @Html.Label("OrderName")
    </div>
    <div class="editor-field">
        @Html.TextBox("OrderName", ViewBag.ProductionOrder as string)
    </div>
 <div class="editor-label">
       @Html.Label("OrderDate")
    </div>
    <div class="editor-field">
        @Html.TextBox("OrderDate", ViewBag.ProductionOrder as DateTime)
</div>
      <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

和我的控制器

   [HttpPost]
     public ActionResult Create(FormCollection collection)
     {
        ProductionRegistration pr = new ProductionRegistration();
        ProductionItem poi = new ProductionItem();

         poi = Viewbag.ProductionOrder;

         pr.SaveOrder(Conn, poi);
         return RedirectToAction("Index");

     }
4

1 回答 1

5

您不能将数据从 ViewBag/ViewData传递到控制器。它是单向的(控制器查看)。将数据返回到控制器的唯一方法是将其发布(post-body)或在查询字符串中发送。

实际上,您应该尽可能避免使用 ViewBag。它是作为一种便利而添加的,并且与大多数便利方法一样,它经常被滥用。使用视图模型将数据传递给视图并从帖子中接收数据。

您使用以下方式强烈键入您的视图:

@model Namespace.For.My.OrderViewModel

然后,您可以使用[Foo]ForRazor 的方法以强类型的方式构建您的字段:

<div class="editor-label">
    @Html.LabelFor(m => m.ProductionOrderNo);
</div>
<div class="editor-field">
    @Html.TextBoxFor(m => m.ProductionOrderNo)
</div>

最后在您的发布操作中,您接受视图模型作为参数:

[HttpPost]
public ActionResult Create(OrderViewModel model)
{
    ...
}

并让 MVC 的模型绑定器为您连接发布的数据。

没有更多的动态。一切都是端到端的强类型,所以如果出现问题,你会在compile-time而不是run-time知道它。

于 2013-05-14T18:43:35.027 回答