【问题标题】:Form won't bind to model on POST request表单不会在 POST 请求中绑定到模型
【发布时间】:2020-10-09 17:38:38
【问题描述】:

这是我的看法:

<form asp-action="SaveAssignments">
    <input type="hidden" asp-for="@Model.CreatedUser" />
    <div class="card m-5">
        <div class="card-header">
            <div class="container d-md-inline-flex justify-content-between">
                <div class="form-group">
                    <h2><label asp-for="Stores" class="form-control-label"></label></h2>
                    <button data-toggle="dropdown" type="button" class="btn btn-lg btn-outline-secondary text-bold dropdown-toggle">@Model.Stores.FirstOrDefault(s => s.Value == Model.SelectedStoreId.ToString())?.Text<span class="caret"></span></button>
                    <div class="dropdown-menu">
                        @foreach (var item in Model.Stores)
                        {
                            <a class="dropdown-item" asp-controller="Web" asp-action="Assignments" asp-route-storeId="@item.Value" asp-route-groupId="@Model.SelectedGroupId">@item.Text</a>
                        }
                    </div>
                </div>
                <div class="form-group align-content-center">
                    <h2><label asp-for="Groups" class="form-control-label"></label></h2>
                    <button data-toggle="dropdown" type="button" class="btn btn-lg btn-outline-secondary text-bold dropdown-toggle">@Model.Groups.FirstOrDefault(s => s.Value == Model.SelectedGroupId.ToString())?.Text<span class="caret"></span></button>
                    <div class="dropdown-menu">
                        @foreach (var item in Model.Groups)
                        {
                            <a class="dropdown-item" asp-controller="Web" asp-action="Assignments" asp-route-storeId="@Model.SelectedStoreId" asp-route-groupId="@item.Value">@item.Text</a>
                        }
                    </div>
                </div>
                <div class="form-group align-self-end">
                    <button type="submit" class="btn btn-primary btn-lg"><i class="fa fa-save"></i>&nbsp;Save</button>
                </div>
            </div>
        </div>
        <div class="card-body">
            <div class="row">
                <div class="form-group col-md-5">
                    <h2><label asp-for="ListZoneFrom" class="form-control-label"></label></h2>
                    <select id="from" asp-for="ListZoneFrom" asp-items="Model.ListZoneFrom" size="15" class="form-control" style="width:100%"></select>
                </div>
              
                <div class="form-group col-md-5">
                    <h2><label asp-for="ListZoneTo" class="form-control-label"></label></h2>
                    <select id="to" asp-for="SelectedZoneTo" asp-items="Model.ListZoneTo" size="15" class="form-control" style="width:100%"></select>
                </div>
            </div>
        </div>
    </div>
</form>

这是我的模型:

 public class AssignmentsViewModel
    {
        public AssignmentsViewModel()
        {
            Groups = new List<SelectListItem>();
            ListZoneFrom = new List<SelectListItem>();
            SelectedZoneTo = new List<int>();
            ListZoneTo = new List<SelectListItem>();
        }
        public int SelectedStoreId { get; set; }
        public int SelectedGroupId { get; set; }
        public List<SelectListItem> Groups { get; set; }
        [Display(Name = "From: ")]
        public List<SelectListItem> ListZoneFrom { get; set; }
        [Display(Name = "To: ")]
        public List<SelectListItem> ListZoneTo { get; set; }
        public List<int> SelectedZoneTo { get; set; }
        public string CreatedUser { get; set; }
        public IEnumerable<SelectListItem> Stores {get; set;}    
    }

当我提交表单 (HttpPost) 时,唯一绑定的参数是 CreatedUser,其余参数要么为 null,要么为 0。我的问题是如何将 List ListZoneTo 中的值绑定到 List SelectedZoneTo?每次我发布时,我都会在该列表中获得 0 个项目。我做错了什么?

  <select id="to" asp-for="SelectedZoneTo" asp-items="Model.ListZoneTo" size="15" class="form-control" style="width:100%"></select>

谢谢

【问题讨论】:

  • 这些列表中似乎没有任何内容。 (您是否包含完整代码?)“SelectList”类型用于填充传统选择标签的选项。 (

标签: asp.net asp.net-mvc asp.net-core model-view-controller


【解决方案1】:

我测试了你的代码,它工作正常,我可以将ListZoneTo 中的值绑定到SelectedZoneTo

问题可能出在您的控制器操作上,您能给我们看看代码吗?

下面是测试示例:

查看:

@model AssignmentsViewModel

<form asp-action="SaveAssignments" asp-controller="Web">
    <input type="hidden" asp-for="@Model.CreatedUser" />
    <div class="card m-5">
        <div class="card-header">
            <div class="container d-md-inline-flex justify-content-between">
                <div class="form-group">
                    <h2><label asp-for="Stores" class="form-control-label"></label></h2>
                    <button data-toggle="dropdown" type="button" class="btn btn-lg btn-outline-secondary text-bold dropdown-toggle">@Model.Stores.FirstOrDefault(s => s.Value == Model.SelectedStoreId.ToString())?.Text<span class="caret"></span></button>
                    <div class="dropdown-menu">
                        @foreach (var item in Model.Stores)
                        {
                            <a class="dropdown-item" asp-controller="Web" asp-action="Assignments" asp-route-storeId="@item.Value" asp-route-groupId="@Model.SelectedGroupId">@item.Text</a>
                        }
                    </div>
                </div>
                <div class="form-group align-content-center">
                    <h2><label asp-for="Groups" class="form-control-label"></label></h2>
                    <button data-toggle="dropdown" type="button" class="btn btn-lg btn-outline-secondary text-bold dropdown-toggle">@Model.Groups.FirstOrDefault(s => s.Value == Model.SelectedGroupId.ToString())?.Text<span class="caret"></span></button>
                    <div class="dropdown-menu">
                        @foreach (var item in Model.Groups)
                        {
                            <a class="dropdown-item" asp-controller="Web" asp-action="Assignments" asp-route-storeId="@Model.SelectedStoreId" asp-route-groupId="@item.Value">@item.Text</a>
                        }
                    </div>
                </div>
                <div class="form-group align-self-end">
                    <button type="submit" class="btn btn-primary btn-lg"><i class="fa fa-save"></i>&nbsp;Save</button>
                </div>
            </div>
        </div>
        <div class="card-body">
            <div class="row">
                <div class="form-group col-md-5">
                    <h2><label asp-for="ListZoneFrom" class="form-control-label"></label></h2>
                    <select id="from" asp-for="ListZoneFrom" asp-items="Model.ListZoneFrom" size="15" class="form-control" style="width:100%"></select>
                </div>

                <div class="form-group col-md-5">
                    <h2><label asp-for="ListZoneTo" class="form-control-label"></label></h2>
                    <select id="to" asp-for="SelectedZoneTo" asp-items="Model.ListZoneTo" size="15" class="form-control" style="width:100%"></select>
                </div>
            </div>
        </div>
    </div>
</form>

控制器:

public IActionResult Index()
{
    var listZoneTo = new List<SelectListItem>
    {
        new SelectListItem{ Text = "AA", Value = "1"},
        new SelectListItem{ Text = "BB", Value = "2"},
        new SelectListItem{ Text = "CC", Value = "3"},
    };

    var listZoneFrom = new List<SelectListItem>
    {
        new SelectListItem{ Text = "aa", Value = "1"},
        new SelectListItem{ Text = "bb", Value = "2"},
        new SelectListItem{ Text = "cc", Value = "3"},
    };

    var stores = new List<SelectListItem>
    {
        new SelectListItem{ Text = "Store1", Value = "1"},
        new SelectListItem{ Text = "Store2", Value = "2"},
        new SelectListItem{ Text = "Store3", Value = "3"},
    };

    var groups = new List<SelectListItem>
    {
        new SelectListItem{ Text = "Group1", Value = "1"},
        new SelectListItem{ Text = "Group2", Value = "2"},
        new SelectListItem{ Text = "Group3", Value = "3"},
    };
    var model = new AssignmentsViewModel();
    model.CreatedUser = "ABC";
    model.SelectedStoreId = 1;
    model.SelectedGroupId = 2;
    model.ListZoneFrom = listZoneFrom;
    model.ListZoneTo = listZoneTo;
    model.Groups = groups;
    model.Stores = stores;
    return View(model);
}

[HttpPost]
public IActionResult SaveAssignments(AssignmentsViewModel model)
{
    return View();
}

结果:

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 2016-08-16
    • 2018-03-27
    • 2023-04-10
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多