Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 数据未从视图传递到控制器_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 数据未从视图传递到控制器

Asp.net mvc 3 数据未从视图传递到控制器,asp.net-mvc-3,Asp.net Mvc 3,我是MVC新手。我无法将数据从视图传递到控制器 此应用程序用于订购衬衫。我有不同类型的T恤、休闲衬衫和正式衬衫。在单一订单中,我想订购2件T恤、3件休闲衬衫和5件正式衬衫。我可以按一个顺序编辑单个值,即任意一个值。我面临的问题是一次订购多种衬衫 public class Shirt { //[Key] public int ShirtId{ get; set; } public string ShirtName{ get; set; } // This is an re

我是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; }
}
我有一个用viewmodel“Order”强类型的视图。最初,我使用

     [HttpGet]
    public ActionResult Index()
    {
       OrdersList();
       return View(db.Order.ToList());
    }
OrdersList是一个与数据库交互并获取订单列表的函数

   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();
            }
        }
    }
[HttpPost]
公共行动结果索引(列表顺序)
{
订单newOrder=新订单();
for(int i=0;i
我的问题是列表顺序传递为Null。如果我这样做
公共操作结果索引(订单)在HttpPost中,我只得到第一项(在本例中,一件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>
订购衬衫
@{List orderList=新列表();}
@foreach(ViewBag.OrderList中的订单ord)
{
@DisplayFor(model=>ord.Shirt.Shirtname)
订单列表。添加(ord);
}
@for(int i=0;iorderList.ElementAt(i.Shirt.ShirtId)
@HiddenFor(model=>orderList.ElementAt(i.OrderId)
@Html.ValidationSummary(true)
@HiddenFor(model=>orderList.ElementAt(i.ShirtId)
@EditorFor(model=>orderList.ElementAt(i).Quantity)
@ValidationMessageFor(model=>orderList.ElementAt(i).Quantity)
}

@ActionLink(“返回列表”、“索引”)
我是MVC新手,这是我的第一个应用程序。如有任何建设性意见和建议,我们将不胜感激。
谢谢

我不明白您为什么要创建
订单列表
而不是视图,实际上您必须从控制器传递该视图,并将视图强键入
列表

而不是用这个,

@Html.EditorFor(model => orderList.ElementAt(i).Quantity)
您可以尝试(如果您将视图强键入
列表

如果视图不是强类型的
列表
,您可以尝试这样做

@Html.EditorFor(m => orderList[i].Quantity)
但在这种情况下,您必须按以下方式更改操作

[HttpPost]
public ActionResult Index([Bind(Prefix="orderList")]List<Order> order)
{
}
[HttpPost]
公共操作结果索引([Bind(Prefix=“orderList”)]列表顺序)
{
}

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

你认为它是强类型的一些模型?豪尔赫,是的,它是强类型的订单类谢谢你马克![Bind(Prefix=“orderList”)]完成了魔术。你能告诉我你为什么要使用它以及它是如何起作用的吗?当然,因为生成的html元素的名称前缀是orderList。如果您看到页面的视图源代码,您可以很容易地理解.Mark,我想对同一示例执行@Html.EditorFor(m=>m[I].Quantity),而不是@Html.EditorFor(m=>orderList[I].Quantity)。我通过@foreach(在ViewBag.OrderList中订购ord)从ViewBag获取我的内容。在这种情况下,i的值是多少,因为我无法执行ViewBag.Count?您可以将ViewBag.OrderList强制转换为List。例如,var orderList=(List)ViewBag.orderList。现在您可以尝试orderList.CountThank u Mark。。我已经这样做了,但是我得到了一个RuntimeBinderExpression,它说不能从DbQuery转换到List。我是否可以使用ViewData而不是ViewBag,比如@for(int I=0;I[HttpPost] public ActionResult Index([Bind(Prefix="orderList")]List<Order> order) { }