【问题标题】:How to pass List<Model> from view into Controller如何将 List<Model> 从视图传递到控制器
【发布时间】:2019-09-17 16:46:49
【问题描述】:

我正在尝试将 List 类型的模型类从视图传递到控制器操作方法。

我无法从 mvc 中找到一个已经内置的方法来完成这项任务,而且我对 ajax/jquery 不太熟悉。以前发布的问题中很少有真正适合我的需求,而且还不够。请帮忙。

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

我的控制器中的一个方法正在等待模型类的 List 类型。

public ActionResult Save(List<MyModel> myModel){
   ...
}

如何将模型类发送到控制器中的方法中?

我尝试了以下 js 代码,但根本不工作

这是我的模型类

public class MyModel
{
    public int spi_id { get; set; }
    public int s_id { get; set; }
    public int st_id { get; set; }
   }

这是我的观点

@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" />

<script type="text/javascript">
$(document).ready(function () {
 $("#btnSend").click(function (e) {
    alert("button click");
    e.preventDefault();

    var model = @Html.Raw(Json.Encode(Model))
    $.ajax({
        type: 'post',
        url: '@Url.Action("Save", "Home")',
        data: JSON.stringify({ myModel: model }),
        contentType: 'application/json; charset=utf-8',
        dataType: "json",
        success: function (data) {
            alert(data);
        }
    });
    });
});

</script>

这是我的控制器

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

        return View("Index");
    }

我需要将此模型的全部内容作为 LIST 传递到我的 Controller 中的 Save 方法中。

【问题讨论】:

  • MyModel类的内容是什么?
  • 它们是简单的类属性 id int school_id int uniruq style_id int colour_id int image_type char(1) last_update smalldatetime last_update_by varchar(15)
  • 您需要创建一个包含 MyModel 类列表的视图模型,然后将该视图模型绑定到该视图。
  • 不需要使用Javascript,模型会随表单回传。你能显示你的表格的html吗?
  • 根据你的表格html,只会显示school_id,你不能编辑任何东西。缺少任何输入字段吗?

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


【解决方案1】:

由于您使用的是listforeach 循环将无法保留和回发模型的值。您必须使用 for 循环和 indexer 为所有字段创建 html 元素,更改您的表格 html 如下:

将模型类型更改为 List,索引器将无法与 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>

并使用 ActionNameHttpPost 属性装饰您的 Save 方法,操作名称应与视图中的表单定义中给出的相同:

[ActionName("Index")]
[HttpPost]
public ActionResult Save(List<MyModel> myModel){
   ...
}

在按钮btnSend点击它会将模型发布回Save方法,不需要任何javascript。

【讨论】:

  • 我使用的是 IEnumerable 而不是 List,这就是我使用 foreach 循环的原因。你现在可以看帖子了,我已经包含了所有的源代码
  • foreach 循环不会帮助您回发模型值,请按照解决问题的答案中给出的解决方案进行更改。
  • 谢谢,我将 foreach 循环更改为 forloop,它只获得正确的行数,但所有字段都有空值,并且我的数据库表中为空。你认为这是为什么?
  • 您只能获取在视图上创建了输入字段的字段的值。您对所有字段都使用Html.DisplayFor,它不会回发这些值。需要一个输入字段来实现这一点。
  • 到目前为止一切顺利,我现在正在获取值,除了 @Html.EnumDropDownListFor 没有 HiddenFor 选项。我不想创建单独的输入字段来复制值,因为它位于下拉列表本身中,用户将在其中进行更改。
【解决方案2】:

端点需要 MyModel 对象列表,但您发送的是单个 MyModel 对象。 还要确保在“公共 ActionResult Save”顶部添加了 [HttpPost] 属性

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

您可以尝试删除这行“var model = @Html.Raw(Json.Encode(Model))”吗?并且只传递模型而不是模型?

【讨论】:

  • 对不起,我错过了包含 [HttpPost] 但我从一开始就拥有它。我不清楚如何将 MyModel 对象作为 List 发送。
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多