如何在HttpPost模型中保留列表对象?

时间:2012-03-27 12:09:10

标签: c# asp.net-mvc razor

我有一个包含自定义类型列表的模型。

我希望在模型作为HttpPost调用控制器时提交此类型的数据。

然而,它似乎没有做我想要的。通过跟踪Passing IEnumerable or list Model to Controller using HttpPost到目前为止,我已经到了目前为止,但我遇到了问题。

我的控制器方法:

    [HttpPost]
    public ActionResult UpdateStock(int id, ProductModel model)
    {
        return View("UpdateStock", model);
    }

现在,View就像这样(修剪过):

@using (Html.BeginForm())
{
<div>
    <p>
    <input type="submit" value="Save" />
    </p>

    @Html.HiddenFor(m => m.ProductNo)

    <div class = "title">
    @Html.LabelFor(m => m.ProductName)
    @Html.EditorFor(m => m.ProductName)
    </div>

            @for ( int i = 0; i < Model.Stock.Count; i++ )
            {
                var item = Model.Stock[i];
                <div class="editor-field">
                    <input type="text" name="Model.Stock[@i].Key"
                        value="@item.Key" />
                </div>
                <div class="editor-field">
                    <input type="text" name="Model.Stock[@i].Value"
                        value="@item.Value" />
                </div>
            }
}

我的问题是,似乎@Html.EditorFor()<input type=.../>标签似乎并不能很好地相互配合。如果我像上面那样,那么使用ProductNo方法的@Html和其他属性将不会传递给模型。

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:2)

我只想使用编辑器模板:

型号:

public class ProductModel 
{
    public string ProductNo { get; set; }
    public string ProductName { get; set; }
    public IEnumerable<Stock> Stocks { get; set; }
}

public class Stock
{
    public string Key { get; set; }
    public string Value { get; set; }
}

控制器:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new ProductModel 
        {
            ProductNo = "123",
            ProductName = "p name",
            Stocks = new[]
            {
                new Stock { Key = "key1", Value = "value1" },
                new Stock { Key = "key2", Value = "value2" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ProductModel model)
    {
        ...
    }
}

查看:

@model ProductModel
@using (Html.BeginForm())
{
    <p>
        <input type="submit" value="Save" />
    </p>

    @Html.HiddenFor(m => m.ProductNo)

    <div class = "title">
        @Html.LabelFor(m => m.ProductName)
        @Html.EditorFor(m => m.ProductName)
    </div>

    @Html.EditorFor(x => x.Stocks)
}

然后为Stock类型(~/Views/Shared/EditorTemplates/Stock.cshtml)定义自定义编辑器模板:

@model Stock
<div class="editor-field">
    @Html.EditorFor(x => x.Key)
</div>
<div class="editor-field">
    @Html.EditorFor(x => x.Value)
</div>