如何在控制器中检索列表?

时间:2011-12-12 15:07:50

标签: asp.net-mvc-3

我的控制器总是为“adjModel”参数获取“null” 如何检索值?

CONTROLLER

[HttpPost]
public ActionResult AdjustmentList(List<AdjustmentVM> adjModel)
{
   // adjModel is null
}

查看

@model List<ExtFramework.ViewModels.BillingArea.AdjustmentVM>

<div class="no-fancybox">
@using (Html.BeginForm("AdjustmentList", "Deposit", new { depositId = ViewBag.depositId }))
{
    <div>
        <table id="adjustment">
            <tr>
                <th>Description</th>
                <th>Montant</th>
            </tr>
            @foreach(var item in Model)
            {
                <tr>
                    <td>@Html.TextBoxFor(model => item.Description)</td>
                    <td>@Html.TextBoxFor(model => item.Amount)</td>
                </tr>
            }
        </table>
        <input type="submit" value="" class="save" />
    </div>
}
</div>

MODEL

namespace ExtFramework.ViewModels.BillingArea
{
    public class AdjustmentVM
    {
        public int AdjustmentId { get; set; }
        public string Description { get; set; }
        public decimal Amount { get; set; }
        public int DepositId { get; set; }
    }
}

2 个答案:

答案 0 :(得分:0)

默认情况下,当你想要一个集合时,你需要确保控件的名称表明它们来自一个数组等。据我所知,默认的绑定器没有这种魔力。

答案 1 :(得分:0)

这是编辑器模板很有用的地方。不使用foreach循环来浏览视图模型列表,而是使用@Html.EditorFor(m => m)。然后,在名为EditorTemplates(MVC命名约定)的子文件夹中添加名为AdjustmentVM.cshtml的视图。同样,这是另一个MVC命名对话 - 使用所使用类型的名称。该文件看起来像:

@model AdjustmentVM

<tr>
    <td>@Html.TextBoxFor(model => model.Description)</td>
    <td>@Html.TextBoxFor(model => model.Amount)</td>
</tr>

运行时将自动循环遍历列表中的项目并呈现编辑器模板的内容,为每个表单值提供唯一的名称,以便默认模型绑定器可以在回发时将这些名称映射到视图模型上的属性。

如果需要,您可以自定义编辑器模板的名称,查看UIHintAttribute类。