c# – List在HttpPost上以MVC的身份返回System.Collections.Generic.List

我有一个用MVC5编写的Web应用程序,它将一个对象列表(包含许多项)传递给一个页面并成功呈现.我在表单上有一个按钮强制回发.当我单击按钮时,模型似乎重新初始化对象列表,而不是返回页面上的内容.

我已经阅读了关于SO的各种帖子,这些帖子涵盖了类似的问题,这些问题提出了许多建议,例如确保对象中的每个项目都在表单上(至少是隐藏的).试过很多选项,但到目前为止还没有成功解决我的问题.

我决定回归它的基础知识,并创建了一个带有List的非常简单的View Model.这再次呈现正常,但在将其作为System.Collections.Generic.List返回时.

查看模型

public class TestVm
{
    public List<string> CustomerNames { get; set; }
}

调节器

public ActionResult Index()
{
    TestVm testmodel = new TestVm();

    testmodel.CustomerNames = new List<string>();
    testmodel.CustomerNames.Add("HELP");
    testmodel.CustomerNames.Add("Its");
    testmodel.CustomerNames.Add("Not");
    testmodel.CustomerNames.Add("Working");
    return View(testmodel); 
}

[HttpPost]
public ActionResult Index(TestVm model)
{
    // DO SOME WORK HERE WITH RETURNED model
    return View(model);
}

视图

@model WebApplication1.Models.TestVm
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>View</title>
</head>
<body>

@using (Html.BeginForm("Index", "Test", Model, FormMethod.Post, new { @class = "form-horizontal" }))
{
    <button name="submit" type="submit" value="Refresh" class="btn btn-sm btn-default pull-right">Refresh</button>
}
<div>
@if (Model.CustomerNames != null)
{

<table>
    <thead>
    <tr>
        <td class="text-center">CustomerName</td>
    </tr>
    </thead>
    <tbody>
    @for (int i = 0; i < Model.CustomerNames.Count(); i++)
    {
        <tr>
            <td class="text-center">@Html.EditorFor(m => m.CustomerNames[i])</td>
            </tr>
        }
        </tbody>
        <tfoot>
        </tfoot>
    </table>
}
</div>
</body>
</html>

我认为创建这样一个简单的应用程序可以帮助我理解和解决我的问题.但我无法弄清楚为什么HttpPost中的模型包含“System.Collections.Generic.List”,而不是我期望的实际字符串列表.

初始加载
Page when loaded up the first time

刷新后

Page after I clicked Refresh

最佳答案 您需要将每个表单控件括在Html.BeginForm括号下

@using (Html.BeginForm("Index", "Test", Model, FormMethod.Post, new { @class = "form-horizontal" }))
{
    <button name="submit" type="submit" value="Refresh" class="btn btn-sm btn-default pull-right">Refresh</button>

    <div>
    @if (Model.CustomerNames != null)
    {

        <table>
            <thead>
                <tr>
                    <td class="text-center">CustomerName</td>
                </tr>
            </thead>
            <tbody>
                @for (int i = 0; i < Model.CustomerNames.Count(); i++)
                {
                    <tr>
                        <td class="text-center">@Html.EditorFor(m => m.CustomerNames[i])</td>
                    </tr>
                }
            </tbody>
            <tfoot>
            </tfoot>
        </table>
    }
    </div>
}
点赞