View 将空模型传递回控制器

本文关键字:控制器 模型 View | 更新日期: 2023-09-27 18:34:24

我在 ASP.NET 有问题。我列出了一个复选框列表,我想将所选值发布回控制器。问题是,我在控制器中收到的模型为空。

我的控制器:

[HttpPost]
// POST: /Checklist/index
public ActionResult Index(Zoeken systemencheckboxenss)
{
    var zoekresultaat = _db.VW_Checks.AsQueryable();
    if (systemencheckboxenss.Systemen != null)
    {
        foreach (var item in systemencheckboxenss.Systemen)
        {
            if(item.isSelected == true)
            {
               zoekresultaat = zoekresultaat.Where(sy => (sy.Systeemnaam.Contains(item.Systeemnaam)));
            }
        }
    }
    var systemen = _db.SYSTEEMs;
    //Lijst van systemen en of het geslecteerd is
    var systeemnamen = new List<CheckboxSysteem>();
    //vult de lijst
    foreach (var i in systemen)
    {
        systeemnamen.Add(new CheckboxSysteem
        {
            Systeemnaam = i.SYSTEEMNAAM,
            isSelected = false,
        });
    }
    var models = new Zoeken
    {
        VwChecks = zoekresultaat.ToList(),
        Systemen = systeemnamen,
    }; 
    return View(models);
}

这是我的观点:

@model UsabilityChecklistApp.ViewModels.Zoeken
@{
    ViewBag.Title = "Index";
}
<h2>Checks</h2>
@using (Html.BeginForm("Index", "Checklist", Model, FormMethod.Post))
{
    <table class="table">
        @foreach (var item in Model.Systemen)
        {
            <tr>
                <td>
                    @Html.HiddenFor(modelItem => item.Systeemnaam)
                    @Html.HiddenFor(modelItem => item.isSelected)
                    @Html.DisplayFor(modelItem => item.Systeemnaam)
                </td>
                <td>
                    @Html.CheckBoxFor(modelItem => item.isSelected)
                </td>
            </tr>
        }
    </table>
    <input type="submit" value="Zoek" />
}

当然还有我的观点模型:

using System.Web;
using UsabilityChecklistApp.Models;
namespace UsabilityChecklistApp.ViewModels
{
    public class Zoeken
    {
        public List<VW_Checks> VwChecks { get; set; }
        public List<CheckboxSysteem> Systemen { get; set; }
    }
    public class CheckboxSysteem
    {
        public string Systeemnaam { get; set; }
        public bool isSelected { get; set; }
    }
}

如果我没有提供解决问题的信息,请询问。

编辑:我必须使用复选框,没有其他可能的选项

View 将空模型传递回控制器

默认情况下,

参数使用其名称进行路由,因此它会尝试将模型映射到名为 Model 的参数。 当您提交表单时,通常会为您处理一些事情,因此您无需担心参数名称,因为模型绑定器将负责映射。

您需要做的就是从表单中删除 Model 参数,以便模型绑定器可以为您处理所有工作

@using (Html.BeginForm("Index", "Checklist", FormMethod.Post))}

要使列表正确映射,您需要像这样更改cshtml:

<table class="table">
    @for(int i = 0; i < Model.Systemen.Count; i++)
    {
        <tr>
            <td>
                @Html.HiddenFor(modelItem => modelItem.Systemen[i].Systeemnaam)
                @Html.DisplayFor(modelItem => modelItem.Systemen[i].Systeemnaam)
            </td>
            <td>
                @Html.CheckBoxFor(modelItem => modelItem.Systemen[i].isSelected)
            </td>
        </tr>
    }
</table>

HTML 帮助程序使用表达式来生成正确的标记,特别是需要具有索引才能正确映射的名称。 如果使用 foreach,则表达式不包含索引,因此生成的名称不正确,无法映射回列表。 对于一个类似的问题,有一个极好的答案,它比我能更好地描述这个问题。

我已经对所有这些进行了快速测试,一旦从 BeginForm 中删除模型参数,它就可以工作了。

我遇到了同样的问题。 我尝试了radio buttons而不是checkbox.浏览链接

MVC3 @Html.单选按钮用于将数据从视图传递到控制器

查看 mvc3 中的控制器

MVC3 @html.radiobuttonfor

如何在重定向操作中传递列表

可能是你的问题会解决。

我重用了你的代码,并做了更改;它工作得很好。尝试使用以下代码:

型:

 public class Zoeken
    {
        public Zoeken() { Systemen = new List<CheckboxSysteem>(); }
        public List<VW_Checks> VwChecks { get; set; }
        public List<CheckboxSysteem> Systemen { get; set; }
    }
    public class CheckboxSysteem
    {
        public string Systeemnaam { get; set; }
        public bool isSelected { get; set; }
    }

控制器:

    // GET: 
    public ActionResult Index()
    {
        var model = new Zoeken();
        CheckboxSysteem obj1 = new CheckboxSysteem();
        CheckboxSysteem obj2 = new CheckboxSysteem();
        CheckboxSysteem obj3 = new CheckboxSysteem();
        obj1.Systeemnaam = "Check1";
        obj1.isSelected = true;
        obj2.Systeemnaam = "Check3";
        obj2.isSelected = false;
        obj3.Systeemnaam = "Check3";
        obj3.isSelected = true;
        model.Systemen.Add(obj1);
        model.Systemen.Add(obj2);
        model.Systemen.Add(obj3);
        return View(model);
    }
    [HttpPost]
    public ActionResult Index(Zoeken model)
    {         
       return View(model);
    }

视图:

@model MvcApplication2.Models.Zoeken
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @using (Html.BeginForm())
        {
            <table class="table">
                @for (int i = 0; i< Model.Systemen.Count; i++)
                {
                    <tr>
                        <td>
                            @Html.HiddenFor(m => m.Systemen[i].Systeemnaam)
                            @Html.HiddenFor(m => m.Systemen[i].isSelected)
                            @Html.DisplayFor(m => m.Systemen[i].Systeemnaam)
                        </td>
                        <td>
                            @Html.CheckBoxFor(m => m.Systemen[i].isSelected)
                        </td>
                    </tr>
                }
            </table>
            <input type="submit" value="Zoek" />
        }
    </div>
</body>
</html>

如果仍然不起作用,请发表评论。