在 MVC 中将数据从视图传递到控制器时,数据列表变为空

Posted

技术标签:

【中文标题】在 MVC 中将数据从视图传递到控制器时,数据列表变为空【英文标题】:List of data is getting null when passing data from view to controller in MVC 【发布时间】:2015-10-13 09:22:05 【问题描述】:

我是 mvc 的新手。我想将数据列表从视图发送到控制器。我可以传递一名员工的详细信息,但不能传递列表。请提出一些建议来解决它。

错误:-

我需要在控制器中获取 Lidt。

  public class EmpDetails

    public int Id  get; set; 
    public string Name  get; set; 
    public int OldSeq  get; set; 
    public int NewSeq  get; set; 

public class DetailsList

    public int Id  get; set; 
    public IEnumerable<EmpDetails> EmpDetailsList  get; set; 

在控制器中有两个方法get和post。在 post 方法中获取 id 但不是 list.it 以 null 的形式出现。

[HttpGet]
    public ActionResult EmployeeDetails()
    
        List<EmpDetails> c2 = new List<EmpDetails>();
        EmpDetails model = new EmpDetails();


        model = new EmpDetails();
        model.Id = 2;
        model.Name = "Alex";
        model.OldSeq = 4;
        model.NewSeq = 5;
        c2.Add(model);

        DetailsList abc = new DetailsList();
        abc.Id = 1;
        abc.EmpDetailsList = c2;
        return View(abc);
    
    [HttpPost]
    public ActionResult EmployeeDetails(DetailsList model)
    

        return View("EmployeeDetails");
    

在视图中,我正在循环数据并显示。

      @using MvcDemo.Models
      @model  DetailsList

       @using (html.BeginForm())

    @Html.ValidationSummary(true)
     @Html.EditorFor(modelItem => modelItem.Id)
    <table>
        @foreach (var item in Model.EmpDetailsList)
        
            <tr>
                <td>
                    @Html.EditorFor(modelItem => item.Id)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => item.OldSeq)
                </td>
                <td>
                     @Html.TextBoxFor(modelItem => item.NewSeq)
                </td>

            </tr>
        
    </table>
        <input type="submit" value="Create" />

【问题讨论】:

您不能使用foreach 循环。您必须使用for 循环(属性必须为IList&lt;EmpDetails&gt; 或者您必须使用自定义EditorTemplate 更多详情请参阅this answer 感谢您的回复。您能解释一下为什么我需要使用 for 循环吗? 另请参阅 this answer 以获取 EditorFor() 方法的示例 @nichu09 - 这是使用 for 循环方法进行绑定的方式,生成的 html 将与您的模型匹配,而您的 post 将起作用。 没错!当您将其可视化时,它会更有意义。 【参考方案1】:

使用这样的编辑器模板。

    在您的Views/Shared 文件夹中创建EditorTemplates 文件夹。 在该文件夹中创建一个名为 EmpDetails.cshtml 的文件。

    将您的 foreach 标记放在该文件中,例如

    @model EmpDetails
    <tr>
        <td>
            @Html.EditorFor(modelItem => Model.Id)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model.Name)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model.OldSeq)
        </td>
        <td>
            @Html.TextBoxFor(modelItem => Model.NewSeq)
        </td>
    </tr>
    

    然后将您的foreach 替换为对@Html.EditorTemplateFor 方法的调用,例如

    @using MvcDemo.Models
    @model  DetailsList
    
    @using (Html.BeginForm())
    
        @Html.ValidationSummary(true)
        @Html.EditorFor(modelItem => modelItem.Id)
        <table>
            @Html.EditorFor(m=>m.EmpDetailsList)
        </table>
        <input type="submit" value="Create" />
    
    

【讨论】:

【参考方案2】:

感谢您的快速回复。在@stephen 评论的帮助下,我将 IEnumerable 集合更改为 List。然后我使用 for 循环而不是 for each。请检查以下代码。

 public class DetailsList

    public int Id  get; set; 

    public List<EmpDetails> EmpDetailsList  get; set; 


 <table>
     @for(int item = 0; item < Model.EmpDetailsList.Count;item++ )
     
            <tr>
                <td>
                    @Html.EditorFor(modelItem => modelItem.EmpDetailsList[item].Id)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => modelItem.EmpDetailsList[item].Name)
                </td>
                <td>
                    @Html.TextBoxFor(modelItem => modelItem.EmpDetailsList[item].OldSeq)
                </td>
                <td>
                     @Html.TextBoxFor(modelItem => modelItem.EmpDetailsList[item].NewSeq)
                </td>

            </tr>
     
        </table>

【讨论】:

【参考方案3】:
 public ActionResult EmployeeDetails()
    
        List<EmpDetails> c2 = new List<EmpDetails>();
        EmpDetails model = new EmpDetails();


        model = new EmpDetails();
        model.Id = 2;
        model.Name = "Alex";
        model.OldSeq = 4;
        model.NewSeq = 5;
        c2.Add(model);

        DetailsList abc = new DetailsList();
        abc.Id = 1;
 //  abc.EmpDetailsList = c2;

//change this might help
    abc.EmpDetailsList = new List<EmpDetails>(c2);


        return View(abc);
    

【讨论】:

也许添加一些关于如何回答问题的细节会有所帮助。 试试这个 abc.EmpDetailsList =new List(c2);

以上是关于在 MVC 中将数据从视图传递到控制器时,数据列表变为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在asp.net mvc中将数据从视图传递到控制器

在 PHP MVC 应用程序中将数据从控制器传递到视图

在 ASP.Net MVC 5 中将 javascript 数组从视图传递到控制器

在 ASP.Net MVC (LINQ) 中将嵌套数据从控制器传递到视图

如何在MVC C#中将文本框和下拉值从视图传递到控制器

如何将项目列表从视图传递到控制器(ASP.NET MVC 4)