Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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
C# 需要通过列表<;模型>;到控制器中的Http Post_C#_Asp.net Mvc 3 - Fatal编程技术网

C# 需要通过列表<;模型>;到控制器中的Http Post

C# 需要通过列表<;模型>;到控制器中的Http Post,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正在向视图传递一个列表。在视图中,我需要传回该列表。它包括一个可编辑的复选框,这是我真正需要的项目。显示的所有其他字段都是只读的。如果用户希望将项目指定为清除,则选中isClearance复选框。因此,当他们点击save按钮时,它会点击HttpPost Index()。但是,它会传回null。如果我将其更改为一个modelObject,而不是List,那么它就可以正常工作 以下是控制器索引: public ActionResult Index() { List<

我正在向视图传递一个列表。在视图中,我需要传回该列表。它包括一个可编辑的复选框,这是我真正需要的项目。显示的所有其他字段都是只读的。如果用户希望将项目指定为清除,则选中isClearance复选框。因此,当他们点击save按钮时,它会点击HttpPost Index()。但是,它会传回null。如果我将其更改为一个modelObject,而不是List,那么它就可以正常工作

以下是控制器索引:

 public ActionResult Index()
    {
        List<ClearanceViewModel> cc = new List<ClearanceViewModel>();
        ClearanceViewModel c = new ClearanceViewModel();
        c.sku = "123";
        c.title = "Test1";
        c.includeOnSite = true;
        c.productID = 123;
        c.salePrice = Convert.ToDecimal(2.99);
        c.RetailPrice = Convert.ToDecimal(4.99);
        c.isClearance = false;
        cc.Add(c);

        c.sku = "123";
        c.title = "Test1";
        c.includeOnSite = true;
        c.productID = 123;
        c.salePrice = Convert.ToDecimal(2.99);
        c.RetailPrice = Convert.ToDecimal(4.99);
        c.isClearance = false;
        cc.Add(c);

        return View(cc);
    }
public ActionResult Index()
{
List cc=新列表();
ClearanceViewModel c=新的ClearanceViewModel();
c、 sku=“123”;
c、 title=“Test1”;
c、 includeOnSite=true;
c、 productID=123;
c、 salePrice=转换为具体价格(2.99);
c、 零售价格=换算到具体价格(4.99);
c、 isClearance=假;
cc.添加(c);
c、 sku=“123”;
c、 title=“Test1”;
c、 includeOnSite=true;
c、 productID=123;
c、 salePrice=转换为具体价格(2.99);
c、 零售价格=换算到具体价格(4.99);
c、 isClearance=假;
cc.添加(c);
返回视图(cc);
}
以下是视图:

@model List<PMS.Models.ClearanceViewModel>
@{    
ViewBag.title = "Clearance List";    
}
<fieldset>
<legend><span>Clearance List</span></legend>
@using (Html.BeginForm())
{
if (Model.Count() > 0)
{    
    <table class="list">
        <tr> 
            <th>Sku</th>
            <th>Title</th>
            <th>Include On Site</th>
            <th>Sale price</th>
            <th>Retail Price</th>
            <th>Quantity</th>
            <th>Clearance</th>
        </tr>
        @foreach(var item in Model)
        {
            @Html.HiddenFor(modelItem => item.productID);
            <tr>    
                <td>@Html.DisplayFor(modelItem => item.sku)</td>
                <td>@Html.DisplayFor(modelItem => item.title)</td>
                <td>@Html.DisplayFor(modelItem => item.includeOnSite)</td>
                <td>@Html.DisplayFor(modelItem => item.salePrice)</td>
                <td>@Html.DisplayFor(modelItem => item.RetailPrice)</td>
                <td>@Html.DisplayFor(modelItem => item.quantity)</td>
                <td>@Html.EditorFor(modelItem => item.isClearance)</td>        
            </tr>
        }
    </table>
   <p>
            <input type="submit" value="Save" />
    </p>

}
}
</fieldset>
@型号列表
@{    
ViewBag.title=“清除列表”;
}
清关单
@使用(Html.BeginForm())
{
如果(Model.Count()>0)
{    
Sku
标题
包括在现场
销售价格
零售价
量
间隙
@foreach(模型中的var项目)
{
@Html.HiddenFor(modeleItem=>item.productID);
@DisplayFor(modelItem=>item.sku)
@DisplayFor(modeleItem=>item.title)
@DisplayFor(modelItem=>item.includeOnSite)
@DisplayFor(modelItem=>item.salePrice)
@DisplayFor(modelItem=>item.RetailPrice)
@DisplayFor(modelItem=>item.quantity)
@EditorFor(modeleItem=>item.isClearance)
}

} }
以下是控制器中的HttpPost(clearanceModel在命中foreach循环时为null,此时它应该有一个项目列表):

[HttpPost]
公共行动结果索引(列表清除模型)
{
foreach(clearanceModel中的ClearanceViewModel项)
{
如果(item.isClearance==true)
{
//获取产品对象,这样我们就可以将其添加到产品促销的清除中
var product=_unitOfWork.ProductRepository.Get(过滤器:p=>p.productID==item.productID).FirstOrDefault();
//确保它没有在产品促销中得到许可
var productPromotion=\u unitOfWork.ProductPromotionRepository.Get(过滤器:pp=>pp.productID==product.productID&&pp.promotion.Name==“清除”).FirstOrDefault();
//添加产品促销
if(productPromotion==null)
{
//获得通关促销
var promotion=\u unitOfWork.PromotionRepository.Get(过滤器:pr=>pr.Name==“清除”).FirstOrDefault();
如果(促销!=null)
{
ProductPromotion promo=新产品促销();
promo.productID=product.productID;
promo.promotionID=promotion.promotionID;
promo.onDate=DateTime.Now;
promo.offDate=null;
promo.canOverwrite=true;
_unitOfWork.ProductPromotionRepository.Create(promo);
_unitOfWork.SaveChanges();
}
}
}
}

您需要一个modelbinder来绑定列表,或者需要一个displayTemplate。现在列表项的生成名称是:item.sku、item.title等。标准modelbinder无法将其绑定到列表。

模型绑定不适用于foreach循环。您必须使用for循环。这样索引器
[i]
用于为生成的html中的每个输入元素创建唯一的名称属性

@for (int i = 0; i < Model.Count; i++)
        {
            @Html.HiddenFor(modelItem => modelItem[i].productID);
            <tr>    
                <td>@Html.DisplayFor(modelItem => modelItem[i].sku)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].title)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].includeOnSite)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].salePrice)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].RetailPrice)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].quantity)</td>
                <td>@Html.EditorFor(modelItem => modelItem[i].isClearance)</td>        
            </tr>
        }
@for(int i=0;imodeleItem[i].productID);
@DisplayFor(modelItem=>modelItem[i].sku)
@DisplayFor(modelItem=>modelItem[i].title)
@DisplayFor(modelItem=>modelItem[i].includeOnSite)
@DisplayFor(modelItem=>modelItem[i].salePrice)
@DisplayFor(modelItem=>modelItem[i].RetailPrice)
@DisplayFor(modelItem=>modelItem[i].quantity)
@EditorFor(modeleItem=>modeleItem[i].isClearance)
}

有关模型绑定集合的详细说明,请查看

工作得非常好!非常感谢!
@for (int i = 0; i < Model.Count; i++)
        {
            @Html.HiddenFor(modelItem => modelItem[i].productID);
            <tr>    
                <td>@Html.DisplayFor(modelItem => modelItem[i].sku)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].title)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].includeOnSite)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].salePrice)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].RetailPrice)</td>
                <td>@Html.DisplayFor(modelItem => modelItem[i].quantity)</td>
                <td>@Html.EditorFor(modelItem => modelItem[i].isClearance)</td>        
            </tr>
        }