【问题标题】:How to pass Models to Controller for selected checkbox using MVC?如何使用 MVC 将模型传递给控制器​​以选择复选框?
【发布时间】:2021-09-28 18:54:32
【问题描述】:

我有一个 ASP.NET Core MVC 应用程序。该视图包含一个下拉列表,其中可以选择同一类别的多个项目。当我按下“提交”时,我想要SomeType 的完整模型(包括Id, Name, Value, ExtraInfo)。在当前设置中,我只得到SomeTypeName

HomeController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using WebApp.Models;

namespace WebApp.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            var viewModel = new MainViewModel()
            {
                SomeInfo = "test",
                SomeModel = new SomeModel
                {
                    Name = "Model1",
                    SomeType1 = new List<SomeType1>
                    {
                        new SomeType1 { Id = "1", Name = "Spinach", Value = "TXT_FLD_SPINA", ExtraInfo = "something1" },
                        new SomeType1 { Id = "2", Name = "Broccoli", Value = "TXT_FLD_BRO", ExtraInfo = "something else5" },
                        new SomeType1 { Id = "3", Name = "Wheatgrass", Value = "TXT_FLD_WHE", ExtraInfo = "something else4" },
                    },
                    SomeOtherType2 = new List<SomeType1>
                    {
                        new SomeType1 { Id = "1", Name = "Apple", Value = "TXT_FLD_APPLE", ExtraInfo = "something" },
                        new SomeType1 { Id = "2", Name = "Banana", Value = "TXT_FLD_BANA", ExtraInfo = "something else" },
                        new SomeType1 { Id = "3", Name = "Tomatoes", Value = "TXT_FLD_TOM", ExtraInfo = "something else2" },
                    }
                }
            };

            return View(viewModel);
        }

        [HttpPost]
        public IActionResult Index(string search, List<SomeType1> SomeType1, string[] SomeOtherType2)
        {
            return View();
        }
    }
}

MainViewModel.cs

using System.Collections.Generic;

namespace WebApp.Models
{
    public class MainViewModel
    {
        public SomeModel SomeModel { get; set; }
        public string SomeInfo { get; set; }
    }

    public class SomeModel
    {
        public List<SomeType1> SomeType1 { get; set; }
        public List<SomeType1> SomeOtherType2 { get; set; }
        public string Name { get; set; }
    }

    public class SomeType1
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Value { get; set; }
        public string ExtraInfo { get; set; }
    }

}

索引.cshtml

@model MainViewModel
@{
    ViewData["Title"] = "Home Page";
}

@using (Html.BeginForm("Index", "Home"))
{
    <div class="text-center">
        <input type="text" name="search" />
        <input type="submit" value="Submit" />
    </div>

    <br />

    foreach (var item in Model.SomeModel.SomeType1)
    {
        <b>Some Type 1</b>
        <div class="checkbox">
            <label>
                <input type="checkbox"
                       name="SomeType1"
                       value="@item.Value" /> @item.Name
            </label>
        </div>
    }

    foreach (var item in Model.SomeModel.SomeOtherType2)
    {
        <b>SomeOtherType2</b>
        <div class="checkbox">
            <label>
                <input type="checkbox"
                       name="SomeOtherType2"
                       value="@item.Value" /> @item.Name
            </label>
        </div>
    }
}

【问题讨论】:

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


    【解决方案1】:

    根据您的描述,我建议您可以尝试修改视图,因为复选框的名称应该是“SomeType1[0].Value”而不是“SomeType1”。由于自动模型绑定在绑定时会检查表单名称,这就是 SomeType1 为空的原因。

    更多细节,您可以参考以下代码:

    @model MainViewModel
    @{
        ViewData["Title"] = "Home Page";
    }
    
    @using (Html.BeginForm("Index", "DropDownTest"))
    {
        <div class="text-center">
            <input type="text" name="search" />
            <input type="submit" value="Submit" />
        </div>
    
        <br />
    
        for (int i = 0; i < Model.SomeModel.SomeType1.Count; i++)
        {
            <b>Some Type 1</b>
            <div class="checkbox">
                <label>
                    <input type="checkbox"
                           name="SomeType1[@i].Value"
                           value="@Model.SomeModel.SomeType1[i].Value" /> @Model.SomeModel.SomeType1[i].Name
                    </label>
                </div>
            }
    
            for (int i = 0; i < Model.SomeModel.SomeOtherType2.Count; i++)
            {
                <b>SomeOtherType2</b>
                <div class="checkbox">
                    <label>
                        <input type="checkbox"
                               name="SomeOtherType2"
                               value="@Model.SomeModel.SomeOtherType2[i].Value" /> @Model.SomeModel.SomeOtherType2[i]..Name
                        </label>
                    </div>
                }
    
    
         
                }
    

    结果:

    【讨论】:

    • 有没有办法同时填写“Id”、“Name”和“ExtraInfo”字段?
    • 可以使用输入隐藏标签来实现。
    • 我确实觉得我在视图中写了太多代码,而且它本来可以更动态的。问题虽然解决了!谢谢白兰度!你太棒了!!
    猜你喜欢
    • 2012-12-31
    • 2023-03-25
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2018-12-15
    • 2020-10-22
    相关资源
    最近更新 更多