C# 如何通过列表<;模型>;从视图到控制器

C# 如何通过列表<;模型>;从视图到控制器,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,我试图将列表类型的模型类从视图传递到控制器操作方法 我无法从mvc中找到一个已经内置的方法来完成这项任务,而且我对ajax/jquery不太熟悉。之前贴出的问题很少不符合我的需要,也没有得到足够的答案。请帮忙 我有一个模型类,我能够填充视图中的所有数据,然后用户将对这些数据中的任何一个进行更改,并且表中显示的所有数据都应该发送到控制器中 控制器中的一个方法正在等待模型类的列表类型 public ActionResult Save(List<MyModel> myModel){

我试图将列表类型的模型类从视图传递到控制器操作方法

我无法从mvc中找到一个已经内置的方法来完成这项任务,而且我对ajax/jquery不太熟悉。之前贴出的问题很少不符合我的需要,也没有得到足够的答案。请帮忙

我有一个模型类,我能够填充视图中的所有数据,然后用户将对这些数据中的任何一个进行更改,并且表中显示的所有数据都应该发送到控制器中

控制器中的一个方法正在等待模型类的列表类型

public ActionResult Save(List<MyModel> myModel){
   ...
}
这是我的看法

@model IEnumerable<MyModel>

<form action="@Url.Action("Save", "Home")" method="post">

<table class="table" id="tblIe">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.s_id)
        </th>

    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.s_id)
            </td>

        </tr>
    }

</table>
<input type="submit" name="send" value="Send" id="btnSend" />
@model IEnumerable
@DisplayNameFor(model=>model.s_id)
@foreach(模型中的var项目)
{
@DisplayFor(modeleItem=>item.s\u id)
}


$(文档).ready(函数(){
$(“#btnSend”)。单击(函数(e){
警报(“按钮点击”);
e、 预防默认值();
var model=@Html.Raw(Json.Encode(model))
$.ajax({
键入:“post”,
url:'@url.Action(“保存”、“主页”),
数据:JSON.stringify({myModel:model}),
contentType:'application/json;charset=utf-8',
数据类型:“json”,
成功:功能(数据){
警报(数据);
}
});
});
});
这是我的控制器

[HttpPost]
    public ActionResult Save(List<MyModel> myModel)
    {
        _service.SaveMyModel(myModel);

        return View("Index");
    }
[HttpPost]
公共操作结果保存(列表myModel)
{
_SaveMyModel(myModel);
返回视图(“索引”);
}

我需要将此模型的全部内容作为列表传递到控制器中的Save方法。

端点需要MyModel对象列表,但您只发送一个MyModel对象。 还要确保在“公共操作结果保存”的顶部添加了[HttpPost]属性

如果由于某种原因无法发送对象列表,则可以创建一个包含MyModel列表的新模型


你能试着删除这行“var model=@Html.Raw(Json.Encode(model))”吗?只需传递Model而不是Model?

因为您使用的是
列表
foreach
循环无法保留和回传Model的值。您必须使用
for
循环和
索引器
为所有字段创建html元素,如下所示更改表格html:

将模型类型更改为“列表”,索引器将无法使用IEnumerable

编辑:
Html.DisplayFor
不会回发该值,需要输入字段才能回发。您可以对所有字段使用
Html.HiddenFor
,如代码所示

@model List<MyModel>

<table>
  <tr><th> @Html.DisplayNameFor(model => model.school_id) </th></tr>
@for(int i = 0; i < Model.Count; i++)
{
  <tr>
        <td>
          @Html.DisplayFor(m=> m[i].school_id)
          @Html.HiddenFor(m=> m[i].school_id)
       </td>
  </tr>
}
</table>

在按钮
btnSend
上单击它将模型发回保存方法,无需任何javascript。

MyModel类的内容是什么?它们是简单的类属性id int school\u id int uniruq style\u id int color\u id int image\u type char(1)last\u update smalldatetime last\u update\u by varchar(15)您将需要创建一个包含MyModel类列表的视图模型,然后将该视图模型绑定到视图。不需要使用Javascript,模型将与表单一起发布。你能显示你的表格的html吗?根据你的表格html,只会显示
学校id
,你不能编辑任何内容。缺少任何输入字段?抱歉,我没有包含[HttpPost],但我从一开始就有了它。我不清楚如何将MyModel对象作为列表发送。我使用的是IEnumerable not List,这就是我使用foreach循环的原因。你现在可以看帖子了,我已经包含了所有的源代码
foreach
循环将不会帮助你发回模型值,按照答案中给出的解决方案进行更改以解决问题。谢谢,我将foreach循环更改为forloop,它只获得正确的行数,但所有字段都有空值,我的数据库表中有空值。为什么会这样?您只能为那些在视图中创建了输入字段的字段获取值。您正在对所有字段使用
Html.DisplayFor
,它不会发回值。需要一个输入字段来实现这一点。到目前为止,我现在得到的是@Html.enumdopdownlist之外的值,该值没有HiddenFor选项。我不想创建一个单独的输入字段来复制该值,因为用户将在dropdownlist中进行更改。
[HttpPost]
    public ActionResult Save(List<MyModel> myModel)
    {
        _service.SaveMyModel(myModel);

        return View("Index");
    }
@model List<MyModel>

<table>
  <tr><th> @Html.DisplayNameFor(model => model.school_id) </th></tr>
@for(int i = 0; i < Model.Count; i++)
{
  <tr>
        <td>
          @Html.DisplayFor(m=> m[i].school_id)
          @Html.HiddenFor(m=> m[i].school_id)
       </td>
  </tr>
}
</table>
[ActionName("Index")]
[HttpPost]
public ActionResult Save(List<MyModel> myModel){
   ...
}