2017-03-16 66 views
0

我有这样一个模型:我怎样才能从视图传递(保存)列表到控制器?

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”,我可以知道发生了什么问题吗?

+2

看看什么是你的HTML。我想你集合的所有输入都有相同的名字。要将多个项目绑定到集合中,您必须让它们以[1..n]索引。 – sephirot

+2

尝试将'foreach'改为简单'for'循环,并为每个模型使用索引数组,例如:'@for(int i = 0; i item [i ] .Tid); Html.EditFor(modelItem => item [i] .Tname)}',或者通过使用'EditorForModel'创建编辑器模板来更有组织的方式。 –

+1

我觉得这个链接对你有帮助。 [如何将列表传递给控制器​​](http://stackoverflow.com/questions/12888248/submit-a-list-from-view-to-controller) –

回答

2

假设你有IEnumerable<TRecord>作为模型绑定到视图中,可以改变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

+0

谢谢!!!! @Tetsuya Yamamoto –

+0

谢谢! Successed保存该列表 @for(VAR I = 0;我 ​​ @ Html.DisplayFor(项目=>项[I] .Tid) ​​ @ Html.EditorFor(item => item [i] .Tname) 我发现我必须使用EditorFor,该值将传递给列表,它使用DisplayFor,变量返回列表将更改为“null”,我怎样才能将原始数据传递给控制器​​而不使用EditorFor? –

+0

您可以使用'@ Html.TextBoxFor(item => item [i] .Tid,new {@readonly =“readonly”})''。请注意,'EditorFor'根据模型上定义的数据类型呈现HTML输入元素,并且应将tid值作为列表输入参数传递。 –

相关问题