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方法只接受请求项列表,则很好,但我需要传递更多信息,并且无法让它将列表作为模型的一部分发布。有人能看出这里有什么问题吗?
您的局部模型是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
的类型,而不是部分,这样您的控件被正确命名(参考这个答案的第二部分的一个例子)
指出:
- 你的单选按钮没有意义,因为它们有不同的名称,以便您可以同时选择(一旦选中,则不能)un-select)
- 你有一个
<textarea>
没有name
属性,所以它不会