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

本文关键字:保留 列表 对象 模型 HttpPost | 更新日期: 2023-09-27 18:29:19

我有一个模型,它包含一个自定义类型的List。

当模型以HttpPost调用控制器的形式提交时,我希望将此类型的数据传回。

然而,它似乎并没有达到我想要的效果。到目前为止,我已经通过使用HttpPost将IEnumerable或列表模型传递给控制器,但我遇到了一个问题。

我的控制器方法:

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

现在,视图是这样的(修剪):

@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=.../>标签之间的配合不太好。如果我有像上面那样的属性,那么使用@Html方法的ProductNo和其他属性将不会传递到模型中。

非常感谢任何建议。

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

我只需要使用编辑器模板:

型号:

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>