2015-04-02 63 views
3

经过多年来在这里得到很多伟大的建议,我终于碰到了自学MVC4 ASP.net的墙。从MVC中查看控制器列表4缺少值?

我用这篇文章this post从我的控制器通过Class类型的列表,我的看法,并回到控制器..

public ActionResult SelectProducts() 
{ 
    displayProductsList = db.Products.ToList(); 
    displayProductsList.ForEach(delegate(Product p) 
    { 
     //get list of recievables for the product 
     GetReceivablesByProductId(p.ProductID).ForEach(delegate(Receivable r) 
     { 
      //Get count of items in inventory for each recievable     
      p.CurrentInventory += this.CountItemsByReceivableID(r.RecievableID); 
     });     
    }); 
    return View(FilterProductInventoryList(displayProductsList)); 
} 

这里是我的看法代码..

@model List<CarePac2.Models.Product> 

@{ 
    ViewBag.Title = "SelectProducts"; 
} 

<h2>SelectProducts</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 
    <table> 
     @*row values*@ 
     @for (int i = 0; i < Model.Count; i++) 
     { 
      <tr> 
       <td>@Html.DisplayFor(m => m[i].Brand)</td> 
       <td>@Html.DisplayFor(m => m[i].ProductName)</td> 
       <td>@Html.DisplayFor(m => m[i].UnitType)</td> 
       <td>@Html.DisplayFor(m => m[i].SalePrice)</td> 
       <td>@Html.DisplayFor(m => m[i].CurrentInventory)</td> 
       <td>     
        @Html.EditorFor(m => m[i].OrderQuantity) 
        @Html.ValidationMessageFor(m => m[i].OrderQuantity) 
       </td> 
       <td></td> 
      </tr> 
     } 
    </table> 
    <p> 
     <input type="submit" value="Save" /> 
     @*<input type="submit" value="Cancel" />*@ 
    </p> 
} 

@section Scripts { 
@Scripts.Render("~/bundles/jqueryval") 

在这里,视图显示它有一个从控制器,以查看传递的列表值..

目视视图正确显示数据(显然我不能发布它的一个形象,直到我有10声誉发表图片)

当我点击提交,并返回到控制器:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult SelectProducts(List<Product> selectedProducts) 
{ 
    if (ModelState.IsValid) 
    { 
    } 
} 

变量selectedProducts不为空。但是,列表中有3个产品项目,就像您在调试器中的下图中看到的那样,即使我有3个产品项目,当产品列表最初传递到视图时,也没有任何值存在。 。

例如(因为我不能发表图片还):

selectedProducts[0].ProductID=0 
selectedProducts[0].ProductName=null 
selectedProducts[1].ProductID=0 
selectedProducts[1].ProductName=null 
+2

您生成的唯一控件是属性'OrderQuantity',这是您的模型将发布的唯一属性。为ID属性添加隐藏输入(如果需要,您应该从数据库中再次获取其他属性) – 2015-04-02 00:58:27

+0

如果您想发布图像,只需提供其URL,然后添加它。 – abatishchev 2015-04-02 01:07:42

+0

你必须获得'OrderQuantity's'的价值吗? – Manoj 2015-04-02 05:16:45

回答

5

您需要使用@Html.HiddenFor()

@Html.HiddenFor(m => m[i].ProductID) 
@Html.HiddenFor(m => m[i].ProductName) 

这将数据发送回控制器。这会创建一个<input type="hidden">,它将成为POST表单的一部分。

+0

好吧,这适用于获取值,当我闯入我的代码时,我的selectedProducts变量在列表中有三个对象,并且每个对象都用值填充,因为它应该是......但是这有一个网站效果,该视图被显示,所有项目我改变形式html.DisplayFor到html.HiddenFor不再可见的视图窗体。我所看到的只是Order Quanity的编辑框。 – 2015-04-02 14:05:22

+0

你需要他们两个。 HiddenFor创建了一个元素,该元素始终通过表单发送回控制器操作。 DisplayFor只是将其作为文本呈现出来,并与绑定到控制器操作无关。如果您不使用模板来基于数据类型呈现值,则还可以使用@Model [i] .Brand来呈现值。 – 2015-04-02 14:57:03

+0

非常感谢,它现在按预期工作。我会花一些时间来了解更多有关不同的标签(标签)以及他们未来的发展。 – 2015-04-03 15:00:57

相关问题