从视图向Controller发送复杂数据

时间:2018-06-13 01:38:03

标签: c# razor asp.net-core-mvc .net-core-2.0

我一直在搜索,但没有一个答案真正为我的特定情况提供了适当的细节。

首先,我正在努力:   - ASP.Net核心Web应用程序   - .Net Core 2.0开发工具   - Visual Studio 2017

我7年后回到ASP.Net并且已经发生了很多变化。

是的,我的问题是:

我想创建一种Master-Detailed View:

我有一个“套餐”模型和一个“世界”模型

我为

创建了scaffolded Item

现在我的数据库结构就像

封装 - PackageID(PK) - PakageName

世界: - WorldID(PK) - WorldName

PackageWorld:   - ID(PK)   - PackageID(FK)   - WorldID(FK)

我正在尝试的是:

我为Package in Package>> Index.cshtml中的每个字段添加了一个“AddWorld”链接。单击它会触发PackageController中的AddWorld函数。此AddWorld控制器显示前面的世界列表和复选框。

现在我想要的是:提交表单,我应该在控制器中收到带有复选框数据的数据,以便我可以应用我的逻辑,即在PackageWorld数据库表中添加每个选定的世界。

我见过很多人用过

FormCollection

检索表单数据,但每次运行时,都要求我将其绑定到模型。

但是我的情况有所不同,因为我不知道它会有多少世界,我实际上无法创建一个模型。或者我可以吗?

以下是我的代码:

获取:AddWorld(PackageController.cs)

// GET: Packages/AddWorld/5
    public async Task<IActionResult> AddWorld(string id)
    {
        var model = await _context.World.ToListAsync();
        ViewData["PackageID"] = id;
        return View(await _context.World.ToListAsync());
    }

AddWorld.cshtml(在Views&gt;&gt; Packages文件夹中)

@{ int count = 0; }

<form asp-action="AddWorld">

    <table class="table">
        <thead>
            <tr>
                <th></th>
                <th>
                    @Html.DisplayNameFor(model => model.WorldID)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.WorldName)
                </th>
                @*<th></th>*@
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                count++;
                <tr>
                    <td><input type="checkbox" name="cbox" id="cbox" /></td>
                    <td>
                        @Html.DisplayFor(modelItem => item.WorldID)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.WorldName)
                    </td>
                    @*<td>
                        <a asp-action="Edit" asp-route-id="@item.WorldID">Edit</a> |
                        <a asp-action="Details" asp-route-id="@item.WorldID">Details</a> |
                        <a asp-action="Delete" asp-route-id="@item.WorldID">Delete</a>
                    </td>*@
                </tr>
                    }
        </tbody>
    </table>

    <input type="hidden" id="count" value="@count;" />
    <input type="hidden" id="PackageID" value="@ViewData["PackageID"]" />
    <input type="submit" value="Add" class="btn btn-default" /> |
    <a asp-action="Index">Back to Package List</a>
</form>

我该怎么办?

 // POST: Packages/AddWorld/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> AddWorld(FormCollection WorldList)
    {

感谢任何帮助。

0 个答案:

没有答案