【问题标题】:how can i pass (save) a list from a view to an controller? [duplicate]如何将列表从视图传递(保存)到控制器? [复制]
【发布时间】:2017-03-16 07:37:04
【问题描述】:

我有一个这样的模型:

public class TRViewModel
{
    public List<TR> TRecord { get; set; }
}

[Table("TRecord")]
public partial class TRecord
{
    [Key]
    [DisplayName("TID")]
    public int Tid { get; set; }
    public String Tname { get; set; }
}

控制器是这样的:

    public ActionResult Audit(int? id)
    {
        var tQ = from t in db.TRecordDBSet
                        select t;

        var list = tQ.ToList();
        return View(list);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Audit(List<TRecord> list)
    {
        if (ModelState.IsValid)
        {
            db.Entry(list).State = System.Data.Entity.EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Audit");
        }
        return View(list);
    }

视图是这样的:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Tid)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Tname)
        </th>
    </tr>
    @foreach (var item in Model)
    {
            <tr>
                    <td>
                            @Html.DisplayFor(modelItem => item.Tid)
                    </td>
                    <td>
                            @Html.EditFor(modelItem => item.Tname)
                    </td>
            </tr>
    }

<div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
</div>

我想将列表传递给控制器​​以将新变量保存到数据库中,但是在调试时我发现列表为“null”,请问我知道出了什么问题吗?

【问题讨论】:

  • 看看你的 html 中有什么。我想您集合中的所有输入都具有相同的名称。要将多个项目绑定到一个集合中,您必须使用 [1..n] 对它们进行索引。
  • 尝试将foreach更改为简单的for循环并为每个模型使用索引数组,例如:@for (int i = 0; i &lt; Model.Count; i++) { Html.DisplayFor(item =&gt; item[i].Tid); Html.EditFor(modelItem =&gt; item[i].Tname) },或者通过使用EditorForModel创建编辑器模板来使用更有条理的方式。
  • 我认为这个链接会对你有所帮助。 how to pass list to controller

标签: c# asp.net asp.net-mvc


【解决方案1】:

假设您将IEnumerable&lt;TRecord&gt; 作为模型绑定到视图,您可以将foreach 循环更改为for 循环,其中包含模型内每个属性的索引数组,并将绑定类型设置为IList 以匹配控制器输入参数:

@model IList<TRecord>

@using (Html.BeginForm())
{
    // display names area

    @for (var i = 0; i < Model.Count; i++)
    {
        <tr>
            <td>
                @Html.DisplayFor(item => item[i].Tid)
            </td>
            <td>
                @Html.EditFor(item => item[i].Tname)
            </td>
        </tr>
    }

    // submit button area
}

发布IEnumerable 集合的另一种方法是创建编辑器模板并将HTML 助手放入其中,然后使用EditorForModel(参见Darin Dimitrov 的方法here)。

类似问题:

How to pass IEnumerable list to controller in MVC including checkbox state?

MVC passing IEnumerable<CustomVM> to Controller

Pass IEnumerable list to controller

【讨论】:

  • 谢谢!!!! @Tetsuya Yamamoto
  • 谢谢!!!成功保存列表 @for (var i = 0; i @Html.DisplayFor(item => item[i].Tid) @Html.EditorFor(item => item[i].Tname) 我发现我必须使用EditorFor,值将传递给列表,我使用DisplayFor,返回列表的变量将更改为“null”,如何在不使用 EditorFor 的情况下将原始数据传递给控制器​​?
  • 您可以使用@Html.TextBoxFor(item =&gt; item[i].Tid, new { @readonly = "readonly" })。请注意,EditorFor 根据模型上定义的数据类型呈现 HTML 输入元素,并且 tid 值应作为列表输入参数传递。
  • 行得通,我不想要这个盒子.....
  • 只希望值显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多