View将空模型传递回控制器

时间:2014-12-17 09:03:07

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

我在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" />
}

当然是我的ViewModel:

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; }
    }
}

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

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

3 个答案:

答案 0 :(得分:1)

默认情况下,参数使用其名称进行路由,因此它会尝试将模型映射到名为Model的参数。当您提交表单时,通常会为您处理事情,因此您不必担心参数名称,因为模型Binder将负责映射。

您需要做的就是从表单中删除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,则表达式不包含索引,因此生成的名称不正确,无法映射回列表。有一个superb answer to a similar question可以提供比我更好的描述。

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

答案 1 :(得分:0)

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

MVC3 @Html.RadioButtonfor Pass data from view to controller

View to Controller in mvc3

MVC3 @html.radiobuttonfor

How to pass List in Redirecttoaction

你的问题可能会解决。

答案 2 :(得分:0)

我重用了你的代码,并做了改动;它完美地运作。尝试使用此代码:

<强>型号:

 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>

评论是否仍无效。