【问题标题】:data not passed from View to controller数据未从视图传递到控制器
【发布时间】:2012-07-16 22:21:08
【问题描述】:

我是 MVC 的新手。我无法将数据从视图传递到控制器。

此应用程序用于订购衬衫。我有不同的类型,如 T 恤、休闲衬衫和正式衬衫。在一个订单中,我想订购 2 件 T 恤、3 件休闲衬衫和 5 件正式衬衫。我能够以一个顺序编辑单个值,即它们中的任何一个。我面临的问题是在一个订单中订购多种类型的衬衫。

public class Shirt    
{
   //[Key]
   public int ShirtId{ get; set; }
   public string ShirtName{ get; set; } // This is an read-only field    
}

public class Order
{
    public int ShirtId { get; set; }
    public virtual Shirt Shirt { get; set; } // a reference to Shirt
    public int Quantity { get; set; } 
    public int OrderId { get; set; }
}

我有一个使用我的视图模型“订单”进行强类型化的视图。最初我将数据从我的控制器传递到视图使用

     [HttpGet]
    public ActionResult Index()
    {
       OrdersList();
       return View(db.Order.ToList());
    }

这里的OrdersList是一个与数据库交互并获取Orders列表的函数

   void OrdersList()
   {
     ViewBag.OrdersLsit= from f in db.Shirt
                            orderby f.ShirtName
                            select f;
   }

我正在使用将数据返回给控制器,

    [HttpPost]
    public ActionResult Index(List<Order> order)
    {
        Order newOrder = new Order();
        for (int i = 0; i < order.Count; i++)
        {
            newOrder.Quantity = order.ElementAt(i).Quantity;
            if (ModelState.IsValid)
            {
                db.Entry(newOrder).State = EntityState.Modified;

                db.SaveChanges();
            }
        }
    }

我的问题是列表顺序作为 Null 传递。如果我这样做
HttpPost 中的 public ActionResult Index(Order order),我只得到第一项(在这种情况下,T 恤正在数据库中更新)。

在 Index.cshtml 中,我正在做这样的事情

  <legend>Order Shirts</legend>
         <table>
            <tr>
                @{List<Order> orderList = new List<Order>(); }
                @foreach (Order ord in ViewBag.OrderList)
                {
                    <td>
                    @Html.DisplayFor(model => ord.Shirt.Shirtname)
                    </td>
                    orderList.Add(ord);
                }
            </tr>

            <tr>
                @for (int i = 0; i < orderList.Count; i++)
                {
                    <td class = "editorClass">
                            @Html.HiddenFor(model => orderList.ElementAt(i).Shirt.ShirtId)
                            @Html.HiddenFor(model => orderList.ElementAt(i).OrderId)
                            @Html.ValidationSummary(true)
 @Html.HiddenFor(model => orderList.ElementAt(i).ShirtId)                                
                            @Html.EditorFor(model => orderList.ElementAt(i).Quantity)
                            @Html.ValidationMessageFor(model => orderList.ElementAt(i).Quantity)
                    </td>
                }
            </tr>
        </table>
    </fieldset>
   <p>
       <input id = "btnSubmit" type="submit" value="Save Order" /> 
    </p>
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

我是 MVC 新手,这是我的第一个应用程序。任何建设性的 cmets 和建议表示赞赏。 谢谢

【问题讨论】:

  • 你的视图是强类型到某些模型的吗?
  • 豪尔赫,是的,它是强类型到 Order 类

标签: asp.net-mvc-3


【解决方案1】:

我不明白您为什么要创建 orderList 而不是视图,实际上您必须将其从控制器传递并强烈键入视图到 List&lt;Order&gt;

不要使用这个,

@Html.EditorFor(model => orderList.ElementAt(i).Quantity)

您可以尝试(如果您将视图强烈键入List&lt;Order&gt;),

@Html.EditorFor(m => m[i].Quantity)

如果视图不是强类型为List&lt;Order&gt;,你可以试试这个,

@Html.EditorFor(m => orderList[i].Quantity)

但在这种情况下,您必须如下更改操作,

[HttpPost]
public ActionResult Index([Bind(Prefix="orderList")]List<Order> order)
{
}

原因是我不确定ElementAt(i) 是否为字段正确生成名称,所以尝试索引方法!

【讨论】:

  • 谢谢马克! [Bind(Prefix="orderList")] 做了魔法。你能告诉我为什么你必须使用它以及它是如何帮助的吗?
  • 当然可以,因为生成的 html 元素的名称以 orderList 为前缀。如果你看到页面的视图源就很容易理解了。
  • 马克,我想为同一个例子做@Html.EditorFor(m => m[i].Quantity) 而不是@Html.EditorFor(m => orderList[i].Quantity) .我正在使用@foreach(ViewBag.OrderList 中的订单)从 ViewBag 获取我的内容。在这种情况下,我无法执行 ViewBag.Count,i 的值是多少?
  • 您可以将 ViewBag.OrderList 转换为 List。前任。 var orderList = (List)ViewBag.OrderList。现在你可以试试 orderList.Count
  • 谢谢你,Mark.. 我已经这样做了,但是我得到一个 RuntimeBinderExpression 说不能从 DbQuery 转换为 List。我可以使用 ViewData 代替 ViewBag,例如 @for (int i = 0; i
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多