MVC模型post与部分显示列表为空

本文关键字:显示 列表 模型 post MVC | 更新日期: 2023-09-27 18:01:33

我现在在兜圈子,所以如果有人能指出这里的问题,我将不胜感激。

我有一个部分,我用来列出项目,这工作得很好。如果传入的项目只是设置为项目的ienumerable,则返回到控制器的工作,但我需要传入一个模型,因为它包含比列表更多的信息。

每次这样做,列表都是空的,我不明白为什么。

分:

@model RequestModel
@section Scripts {
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet">
<style>
    .btn span.glyphicon {
        opacity: 0;
    }
    .btn.active span.glyphicon {
        opacity: 1;
    }
</style>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.min.js"></script>
}
@for (var i = 0; i < Model.Requests.Count(); i++)
{
    <div @(Model.Requests.Count == 3 ? "class=col-md-4" : Model.Requests.Count() == 2 ? "class=col-md-6" : "class=col-md-12")>
        @Html.HiddenFor(m => Model.Requests[i].RequestID)
        <table class="table table-responsive img-rounded">
            <thead>
                <tr class="alert-cascade">
                    <th colspan="2">
                        <div class="btn-group btn-group-sm pull-right" role="group" data-toggle="buttons">
                            <button class="btn btn-success" data-toggle="tooltip" title="Accept" id="acceptradio">
                                @Html.RadioButtonFor(m => Model.Requests[i].AcceptChecked, Model.Requests[i].AcceptChecked, new { @id = Model.Requests[i].RequestID, @style = "display:none" })
                                <span>Accept </span>
                                <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
                            </button>
                            <button class="btn btn-warning" data-toggle="tooltip" title="Reject" id="rejectradio">
                                @Html.RadioButtonFor(m => Model.Requests[i].RejectChecked, Model.Requests[i].RejectChecked, new { @id = Model.Requests[i].RequestID, @style = "display:none" })
                                <span>Reject </span>
                                <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
                            </button>
                        </div>
                        @Model.Requests[i].EmployeeDescription
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><strong>Request Type</strong></td>
                    <td class="text-right">@Model.Requests[i].RequestType</td>
                </tr>
                <tr>
                    <td><strong>Duration</strong></td>
                    <td class="text-right">@Model.Requests[i].DurationDescription</td>
                </tr>
                <tr>
                    <td><strong>Dates</strong></td>
                    <td class="text-right">@Model.Requests[i].DatesDescription</td>
                </tr>
            </tbody>
        </table>
    </div>
}
视图:

    @model RequestPageModel
@{
    ViewData["Title"] = "Requests";
    ViewData["SubTitle"] = "Welcome to Cascade Mobile";
}
@{Layout = "~/Views/Shared/_MainLayout.cshtml";}
@section Scripts {
    <script type="text/javascript">
        //Submit count setter
        $(document).ready(function () {
            var accepted = 0;
            var rejected = 0;
            $("#acceptradio").click(function () {
                console.log("ready 2!");
                $("#acceptCount").text("4");
            });
        });
</script>
}
<div class="container">
    <h3>@ViewBag.Warning</h3>
        @*Existing requests*@
        <h4><strong>Requests</strong> <span class="badge alert-cascade">@Model.Pager.TotalRecords</span></h4><br />
    @using (Html.BeginForm("Index", "Request", new { @id = "requestsform" }))
    {
        <div class="row">
            @Html.Partial("_MultiSelectPartial", Model.RequestModel)
        </div>
        <div>
            <textarea class="span6" rows="3" placeholder="Comments.." required></textarea>
        </div>
        <input type="submit" value="submit"/>
    }
    <button id="submitbtn" class="btn btn-primary pull-right" type="button">
        Accept 
        <span class="badge" id="acceptCount">0</span>
        Reject 
        <span class="badge" id="rejectCount">0</span>
    </button>
    @Html.Partial("_Pager", Model.Pager)
</div>

控制器动作:

[HttpPost]
        public IActionResult Index(RequestModel requests)
        {
            ViewBag.Warning = "We have: ";
            foreach (var request in requests.Requests)
            {
                ViewBag.Warning +=  request.RequestID + " : ** : ";
            }
            var requestModel = GetRequestPageModel(3,1);
            //requestModel.Requests[0].AcceptChecked = true;
            return View("~/Views/User/Requests.cshtml", requestModel);
        }

模型:

using System;
using System.Collections.Generic;
namespace Mobile.Models
{
    /// <summary>
    /// Request data model for the requests page
    /// </summary>
    public class RequestModel
    {
        public List<Request> Requests;
        public RequestModel(List<Request> requests)
        {
            Requests = requests;
        }
        public RequestModel()
        {
            Requests = new List<Request>();
        }
    }
}

同样,如果post方法只接受请求项列表,则很好,但我需要传递更多信息,并且无法让它将列表作为模型的一部分发布。有人能看出这里有什么问题吗?

MVC模型post与部分显示列表为空

您的局部模型是RequestModel,您的循环正在生成控件

name="Requests[0].RequestID"
name="Requests[1].RequestID"

等,但你的POST方法中的模型应该是RequestPageModel,所以正确的name属性需要是

name="RequestModel.Requests[0].RequestID"
name="RequestModel.Requests[1].RequestID"

将返回到

[HttpPost]
public IActionResult Index(RequestPageModel model)

您需要将局部视图中的模型更改为@model RequestPageModel(并相应地调整HtmlHelper方法),并在主视图中使用@Html.Partial("_MultiSelectPartial", Model)

此外,将参数的名称更改为(例如)RequestModel model,这样就不会与等效的属性名称发生冲突(请参阅此答案以获取解释)。

然而,我建议您使用自定义EditorTemplate的类型,而不是部分,这样您的控件被正确命名(参考这个答案的第二部分的一个例子)

指出:

  1. 你的单选按钮没有意义,因为它们有不同的名称,以便您可以同时选择(一旦选中,则不能)un-select)
  2. 你有一个<textarea>没有name属性,所以它不会