【问题标题】:When i send my form, my checkboxes values results always NULL当我发送表单时,我的复选框值结果始终为 NULL
【发布时间】:2016-04-01 16:49:03
【问题描述】:

我有一个表单,我在其中填充了 HairTags 表中的一些复选框,

一切正常,我在表单中显示我的复选框,但是当我选择其中一些并尝试发送时,所有值结果都为 NULL,并且我没有将它们的 id 保存在我提交的 Creationtag 中

在我的模型中

//CHECKBOXES
public class HairTagModel
{
    //[Key]
    public int Value { get; set; }
    public string Text { get; set; }
    public bool IsChecked { get; set; }
}



public class CreationHairTagsModel
{
    //public Creation Creation { get; set; }
    //public List<HairTagModel> CreationHairTags { get; set; }

    public CreationHairTagsModel()
    {
        Creation = new Creation();
    }
    public Creation Creation { get; set; }

    private ApplicationDbContext creationdb = new ApplicationDbContext();

    public List<HairTagModel> CreationHairTags
    {
        get
        { 
            var HairTagList = creationdb.HairTags.ToList();

            List<HairTagModel> obj = new List<HairTagModel>();

            foreach (var tags in HairTagList)
            {
                obj.Add(new HairTagModel
                {
                    Text = tags.HairTagTitle,
                    Value = tags.HairTagId,
                    IsChecked = false
                });
            }

            return obj;
        }
    }
}

在我的页面中

<div class="col-md-12">
    @for (int i = 0; i < Model.CreationHairTags.Count; i++)
    {
        @Html.CheckBoxFor(m => Model.CreationHairTags[i].IsChecked)
        @Model.CreationHairTags[i].Text
        @Html.HiddenFor(m => Model.CreationHairTags[i].Value)
        @Html.HiddenFor(m => Model.CreationHairTags[i].Text)<br />
    }
</div>

在我的控制器中

[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult CreationUpload(CreationHairTagsModel creationbind, IEnumerable<HttpPostedFileBase> files)
{
    if (ModelState.IsValid)
    {   
    ///...CODE HIDDEN...

       //Tags
        StringBuilder sb = new StringBuilder();
        foreach (var item in creationbind.CreationHairTags)
        {
            if (item.IsChecked)
            {                                        
                sb.Append(item.Value + ",");
            }
        }
        creationbind.Creation.Creationtag = sb.ToString();
    }
}

我的代码有什么问题请帮忙解释一下?

【问题讨论】:

  • 嗨,我把它们取下来了,但我遇到了同样的问题。
  • 您的财产必须是public List&lt;HairTagModel&gt; CreationHairTags { get; set; }。你的视图模型不应该有数据库访问代码(它不可能进行单元测试)。它是负责访问数据库的控制器(在这种情况下,设置 CreationHairTags 的值
  • 在控制器GET方法中-var model = new CreationHairTagsModel(); model.CreationHairTags = creationdb.HairTags.Select(x =&gt; new HairTagModel { Text = x.HairTagTitle, Value = x.HairTagId }).ToList(); return View(model);

标签: asp.net-mvc checkbox


【解决方案1】:

您的模型没有为 List 提供一个 setter 方法。只是一个吸气剂。

基本上您已将该字段设为只读。我不会讨论此代码存在的违反 SOLID 的情况。你可以用不同的方式从模型绑定器中取回数据,试试

public ActionResult CreationUpload(CreationHairTagsModel creationbind, List<HairTagModel> creationHairTags, IEnumerable<HttpPostedFileBase> files)

模型绑定器应该使用它在表单列表中找到的值填充 creationHairTags 参数。

【讨论】:

  • 嗨,谢谢@Slicksim,我用控制器中的代码替换了,我也在这里做了:foreach(creationHairTags 中的var item),现在正在工作!抱歉,我是 MVC 的初学者,我不知道什么是“违反 SOLID”。
  • @CarlesAmnesty,就缺少的 setter 而言,答案是正确的,但不要更改您的 POST 方法(添加 List&lt;HairTagModel&gt; creationHairTags 参数永远不会起作用)
  • 不要这样做(你不了解模型绑定过程)。请参阅我在您的问题中的评论。
  • 嗨@Stephen Muecke,但如果我取消此代码:我的复选框不再被选中..并且所有值都未选中= NULL..抱歉,但我丢失了一些东西......应该我代替吗? (但是……这段代码是怎么工作的?)
  • @CarlesAmnesty。您是否将属性更改为public List&lt;HairTagModel&gt; CreationHairTags { get; set; }
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2012-11-23
  • 2017-06-03
相关资源
最近更新 更多