【问题标题】:Problem with checkbox and model binding always return false复选框和模型绑定的问题总是返回 false
【发布时间】:2019-05-04 22:43:14
【问题描述】:


我在后台处理复杂表格时遇到问题。
当表单在 [HTTP POST] 中发送到服务器时,我的模型是错误的。 即使我选中了复选框,我的模型也总是返回 false。 我希望你们能帮助我,我在这个问题上浪费了很多时间,却一无所获。

我的模型的一部分

<!-- language: lang-csharp -->
public class project{
    ......
    public List<Skill> Skills { get{....} set{}    }
public class Skill
{
    public int SkillId { get; set; }
    public string SkillName { get; set; }
    public string SkillNumber { get; set; }
    public bool IsChecked { get; set; }
    public HttpPostedFileBase files { get; set; }
}

我的部分观点

<!-- language: lang-razor -->
for (int i = 0; i < Model.Skills.Count; i++)
{
        <div class="form-group row">
            <div class="col-8">
                @Html.CheckBoxFor(model => model.Skills[i].IsChecked)
                @Html.LabelFor(model => model.Skills[i].IsChecked, Model.Skills[i].SkillName)
            </div>
            <div class="col-4">
                <input type="hidden" name="@Model.Skills[i].SkillId" id="@Model.Skills[i].SkillId"  />
            </div>
        </div>
 }

我的控制器的一部分

<!-- language: lang-csharp -->
foreach (Models.Skill skill in viewModel.Skills)
            {
                if (skill.IsChecked)
                {
                    if(skill.files.ContentLength > 0)
                    {
                        string fileName = skill.SkillNumber;
                        string filepath = (path + "/" + fileName);
                        skill.files.SaveAs(filepath);
                    }
                }
            }

如果你们需要更多信息,别忘了问。

更新:

剃须刀 - cshtml 视图

@using (Html.BeginForm())
{
    <div class="form-group">
        @Html.LabelFor(model => model.ProjectTitle)
        @Html.TextBoxFor(model => model.ProjectTitle, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ProjectTitle, String.Empty, new { @class = "form-text text-muted" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.ProjectDescriptionShort)
        @Html.TextBoxFor(model => model.ProjectDescriptionShort, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ProjectDescriptionShort, String.Empty, new { @class = "form-text text-muted" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.ProjectDescriptionFull)
        @Html.TextBoxFor(model => model.ProjectDescriptionFull, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ProjectDescriptionFull, String.Empty, new { @class = "form-text text-muted" })
    </div>
    <div class="form-group">
        @Html.LabelFor(Model => Model.ProjectTypes)<br />
        @Html.DropDownListFor(Model => Model.ProjectTypeId, Model.ProjectTypes, "Selectionnez une type de projet", new { @class = "form-control" })
        @Html.ValidationMessageFor(Model => Model.ProjectTypes, String.Empty, new { @class = "form-text text-muted" })
    </div>
    for (int i = 0; i < Model.Skills.Count; i++)
    {
            <div class="form-control">
                    @Html.CheckBoxFor(model => model.Skills[i].IsChecked)
                    @Html.LabelFor(model => model.Skills[i].IsChecked, Model.Skills[i].SkillName)
            </div>
        }
    <input type="submit" value="valider" />
}

控制器动作

[HttpPost]
public ActionResult Index(Models.Project viewModel)
{
    if (ModelState.IsValid)
    {
        Models.User user = (Models.User)Session["User"];
        Datas.DataSetProjectTableAdapters.tbProjectTableAdapter tbProjectTableAdapter = new Datas.DataSetProjectTableAdapters.tbProjectTableAdapter();
        tbProjectTableAdapter.Insert(
            viewModel.ProjectTitle
            , viewModel.ProjectDescriptionShort
            , viewModel.ProjectDescriptionFull
            , user.UserId
            , viewModel.ProjectTypeId
            );
        Datas.DataSetProject.tbProjectDataTable lastProjectEntry = tbProjectTableAdapter.GetDataByLastInsert();
        int projectId = (int)lastProjectEntry.Rows[0]["Id"];


        string path = Server.MapPath("~/App_Data/UploadedFiles/Project/" + viewModel.ProjectTitle);  // Give the specific path
        if (!(System.IO.Directory.Exists(path)))
        {
            System.IO.Directory.CreateDirectory(path);
        }
        else{}
        foreach (Models.Skill skill in viewModel.Skills)
        {
            if (skill.IsChecked)
            {
                if(skill.files.ContentLength > 0)
                {
                    ... not implented yet
                }
            }
        }
    }
    return View(viewModel);
}

查看模型 c#

public class Project
{
    [Required]
    public string ProjectTitle { get; set; }
    [Required]
    public string ProjectDescriptionShort { get; set; }
    [Required]
    public string ProjectDescriptionFull { get; set; }
    [Required]
    public int ProjectTypeId { get; set; }
    public IEnumerable<SelectListItem> ProjectTypes
    {
        get
        {
            Datas.DataSetProject.tbProjectTypeDataTable tbProjectTypes = new Datas.DataSetProjectTableAdapters.tbProjectTypeTableAdapter().GetData();
            List<SelectListItem> Items = new List<SelectListItem>();
            foreach(Datas.DataSetProject.tbProjectTypeRow row in tbProjectTypes)
            {
                Items.Add(new SelectListItem()
                {
                    Value = row.Id.ToString(),
                    Text = row.ProjectName
                });
            }
            return Items;
        }
        set { }
    }

    public List<Skill> Skills
    {
        get
        {
            Datas.DataSetProject.tbSkillDataTable tbSkills = new Datas.DataSetProjectTableAdapters.tbSkillTableAdapter().GetData();
            List<Skill> Items = new List<Skill>();
            foreach (Datas.DataSetProject.tbSkillRow row in tbSkills)
            {
                Items.Add(new Skill()
                {
                    SkillId = row.Id,
                    SkillName = row.SkillNumber + " - " + row.SkillName,
                    SkillNumber = row.SkillNumber

                });
            }
            return Items;
        }
        set { }
    }

}

public class Skill
{
    public int SkillId { get; set; }
    public string SkillName { get; set; }
    public string SkillNumber { get; set; }
    public bool IsChecked { get; set; }
    public HttpPostedFileBase files { get; set; }
}

【问题讨论】:

  • 你应该发布你所有的 cshtml 文件和 http post action,我尝试重现它仍然可以

标签: c# asp.net-mvc


【解决方案1】:

问题是您的视图仅显示每个技能的复选框并为其分配值。它没有将复选框直接绑定到正确的模型属性。请参阅这篇关于为集合创建显示模板的帖子。这是您需要采取的方向。从长远来看,它更容易维护和重用。

ASP.net MVC - Display Template for a collection

此外,您在视图模型中的技能获取器似乎只返回一个全新的列表。这可能是控制器每次都会获得一个所有内容都是错误的新列表的原因。尝试在视图模型的构造函数中构建列表,并使用默认的 getter 和 setter。

【讨论】:

  • 是的,这点,我尝试在将 viewModel 发送到查看之前在控制器中构建列表,并为我的列表属性使用默认的 Get/set 并且它工作!非常感谢
【解决方案2】:

您能否尝试以下代码而不是 CheckboxFor,它会起作用:

@Html.CheckBox("IsChecked", model.Skills[i].IsChecked)

如果您在尝试了这个之后仍然遇到问题,请告诉我。

【讨论】:

  • 我刚试过,问题是一样的,当我循环我的 List boolean 总是假
【解决方案3】:

你应该发布你所有的 cshtml 文件和 http post action

剃须刀 - cshtml 视图

@using (Html.BeginForm())
{
    <div class="form-group">
        @Html.LabelFor(model => model.ProjectTitle)
        @Html.TextBoxFor(model => model.ProjectTitle, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ProjectTitle, String.Empty, new { @class = "form-text text-muted" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.ProjectDescriptionShort)
        @Html.TextBoxFor(model => model.ProjectDescriptionShort, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ProjectDescriptionShort, String.Empty, new { @class = "form-text text-muted" })
    </div>
    <div class="form-group">
        @Html.LabelFor(model => model.ProjectDescriptionFull)
        @Html.TextBoxFor(model => model.ProjectDescriptionFull, new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.ProjectDescriptionFull, String.Empty, new { @class = "form-text text-muted" })
    </div>
    <div class="form-group">
        @Html.LabelFor(Model => Model.ProjectTypes)<br />
        @Html.DropDownListFor(Model => Model.ProjectTypeId, Model.ProjectTypes, "Selectionnez une type de projet", new { @class = "form-control" })
        @Html.ValidationMessageFor(Model => Model.ProjectTypes, String.Empty, new { @class = "form-text text-muted" })
    </div>
    for (int i = 0; i < Model.Skills.Count; i++)
    {
            <div class="form-control">
                    @Html.CheckBoxFor(model => model.Skills[i].IsChecked)
                    @Html.LabelFor(model => model.Skills[i].IsChecked, Model.Skills[i].SkillName)
            </div>
        }
    <input type="submit" value="valider" />
}

控制器动作

    [HttpPost]
    public ActionResult Index(Models.Project viewModel)
    {
        if (ModelState.IsValid)
        {
            Models.User user = (Models.User)Session["User"];
            Datas.DataSetProjectTableAdapters.tbProjectTableAdapter tbProjectTableAdapter = new Datas.DataSetProjectTableAdapters.tbProjectTableAdapter();
            tbProjectTableAdapter.Insert(
                viewModel.ProjectTitle
                , viewModel.ProjectDescriptionShort
                , viewModel.ProjectDescriptionFull
                , user.UserId
                , viewModel.ProjectTypeId
                );
            Datas.DataSetProject.tbProjectDataTable lastProjectEntry = tbProjectTableAdapter.GetDataByLastInsert();
            int projectId = (int)lastProjectEntry.Rows[0]["Id"];


            string path = Server.MapPath("~/App_Data/UploadedFiles/Project/" + viewModel.ProjectTitle);  // Give the specific path
            if (!(System.IO.Directory.Exists(path)))
            {
                System.IO.Directory.CreateDirectory(path);
            }
            else{}
            foreach (Models.Skill skill in viewModel.Skills)
            {
                if (skill.IsChecked)
                {
                    if(skill.files.ContentLength > 0)
                    {
                        ... not implented yet
                    }
                }
            }
        }
        return View(viewModel);
    }

查看模型 c#

public class Project
{
    [Required]
    public string ProjectTitle { get; set; }
    [Required]
    public string ProjectDescriptionShort { get; set; }
    [Required]
    public string ProjectDescriptionFull { get; set; }
    [Required]
    public int ProjectTypeId { get; set; }
    public IEnumerable<SelectListItem> ProjectTypes
    {
        get
        {
            Datas.DataSetProject.tbProjectTypeDataTable tbProjectTypes = new Datas.DataSetProjectTableAdapters.tbProjectTypeTableAdapter().GetData();
            List<SelectListItem> Items = new List<SelectListItem>();
            foreach(Datas.DataSetProject.tbProjectTypeRow row in tbProjectTypes)
            {
                Items.Add(new SelectListItem()
                {
                    Value = row.Id.ToString(),
                    Text = row.ProjectName
                });
            }
            return Items;
        }
        set { }
    }

    public List<Skill> Skills
    {
        get
        {
            Datas.DataSetProject.tbSkillDataTable tbSkills = new Datas.DataSetProjectTableAdapters.tbSkillTableAdapter().GetData();
            List<Skill> Items = new List<Skill>();
            foreach (Datas.DataSetProject.tbSkillRow row in tbSkills)
            {
                Items.Add(new Skill()
                {
                    SkillId = row.Id,
                    SkillName = row.SkillNumber + " - " + row.SkillName,
                    SkillNumber = row.SkillNumber

                });
            }
            return Items;
        }
        set { }
    }

}

public class Skill
{
    public int SkillId { get; set; }
    public string SkillName { get; set; }
    public string SkillNumber { get; set; }
    public bool IsChecked { get; set; }
    public HttpPostedFileBase files { get; set; }
}

【讨论】:

    【解决方案4】:

    有时CheckboxFor会有一些匿名错误,请使用下面的代码作为建议。

    <input type="hidden" name="@model.Skills[i].SkillId" /> 
    
    <input type="checkbox" name="@model.Skills[i].IsChecked" />
    

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2019-03-13
      • 1970-01-01
      • 2012-02-16
      • 2020-06-16
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多