【问题标题】:In MVC 6, how to code checkbox list in view and pass the checked values to the controller?在 MVC 6 中,如何在视图中编写复选框列表并将选中的值传递给控制器​​?
【发布时间】:2016-08-19 17:22:41
【问题描述】:

抱歉,我的大部分搜索都将我带到旧的 MVC 代码。任何帮助将不胜感激。

在带有标签助手的 MVC 6 中,如何编写一组复选框:

  • 对标签使用标签助手,因此单击它会切换选中的值
  • 将选中的值保存(绑定?)到 IsOptionSelected 属性
  • 单击提交后将这些检查值传回控制器

?

我能够正确显示带有标签的复选框,但我不知道如何通过模型将选中的值传递回控制器。现在,IsOptionSelected 值返回为 false。

我还能够使标签的 html 助手工作,但不能用于标签助手。我可能也将这些代码都写错了,所以任何提示都会有所帮助!

这是我目前所拥有的:

显示:

实体:

public class PhoneOption
{
    public bool IsOptionSelected { get; set; } = false;
    public int OptionId { get; set; }
    public string OptionName { get; set; }
}

型号:

[Display(Name = "Phone Options")]
public IEnumerable<PhoneOption> PhoneOptions { get; set; }

. . . .
PhoneOptions = repository.GetPhoneOptions();

存储库:

public IEnumerable<PhoneOption> GetPhoneOptions()
{
    IEnumerable<PhoneOption> options = new[]
    {
        new PhoneOption { OptionId = 1, OptionName = "Phone Case",       IsOptionSelected = false },  
        new PhoneOption { OptionId = 2, OptionName = "Screen Protector", IsOptionSelected = false },
        new PhoneOption { OptionId = 3, OptionName = "Car Charger",      IsOptionSelected = false },
        new PhoneOption { OptionId = 4, OptionName = "Extra Cable",      IsOptionSelected = false }
    };
    return options;
 }

查看:

<div class="form-group">
    <label class="control-label">Phone Options</label>
    <div>
        @foreach (var option in Model.PhoneOptions)
        {
            <div>
                @{ string cbId = "PhoneOption_" + @option.OptionId; }
                <input asp-for=@option.IsOptionSelected type="checkbox" value=@option.IsOptionSelected id=@cbId name=@cbId />
                @Html.Label(@cbId.ToString(), @option.OptionName)
                @*This is causing invalid operation exception*@
                @*<label asp-for=@cbId.ToString()>@option.OptionName</label>*@ 
                <span asp-validation-for=@cbId class="text-danger" role="alert"></span>
            </div>
        }
    </div>    
</div>

提前致谢!

【问题讨论】:

  • 我猜 asp-for 的使用方式有误。将输入中的 asp-for=@option.IsOptionSelected 更改为 asp-for="IsOptionSelected",这将确保它绑定到 PhoneOption 中的正确属性。标签 asp-for=@cbId.ToString() 中的相同内容是错误的。请查看此处的教程以获取标签助手。davepaquette.com/archive/2015/05/18/mvc6-select-tag-helper.aspx
  • 感谢您的建议,但更改为 asp-for="IsOptionSelected" 会引发语法错误,因为它不在主模型中。它是每次迭代的 Model.PhoneOption 选项的一部分。 asp-for=option.IsOptionSelected 也不起作用。是的,我之前已经阅读过该教程,但它并没有像我想要做的那样涵盖复选框列表。
  • 啊,我明白了。检查这个是否有帮助stackoverflow.com/questions/15375800/…
  • @AmeteGirl。为有用的链接 +1。

标签: c# checkbox asp.net-core-mvc tag-helpers


【解决方案1】:

这就是我最终为使其正常工作所做的事情。我不确定这是否是最好的方法。我不得不仍然使用 html 助手,因为标签助手不起作用。

型号:

public List<PhoneOption> PhoneOptions { get; set; }
. . .
PhoneOptions = repository.GetPhoneOptions().ToList();

查看

@if (@Model.PhoneOptions != null && @Model.PhoneOptions.Count() > 0)
{
    for (int i = 0; i < @Model.PhoneOptions.Count(); i++)
    {
        <div>
            <input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" />
            <label asp-for="@Model.PhoneOptions[i].IsOptionSelected">@Model.PhoneOptions[i].OptionName</label>

            @*If these are not included, all OptionIds become 0 and all OptionName becomes null*@
            @Html.HiddenFor(x => @Model.PhoneOptions[i].OptionId)
            @Html.HiddenFor(y => @Model.PhoneOptions[i].OptionName)
        </div>
    }    
}

我希望这可以帮助遇到相同复选框列表问题的其他人。

更新: 我已将 html 助手更新为上面的标签助手。

【讨论】:

  • 很高兴它为您工作。感谢您发布您的解决方案。
  • 使用标签助手应该可以正常工作 - &lt;input asp-for="Model.PhoneOptions[i].IsOptionSelected" type="checkbox" /&gt; 只要您使用 for 循环并且集合是 IList&lt;T&gt;(不是 IEnumerable&lt;T&gt;
  • 谢谢,@StephenMuecke!我试过了,它做了一点改动 - &lt;input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" id="@cbId" /&gt;。我仍然无法让标签的标签助手“附加”到复选框。这两个:1)&lt;label asp-for="@Model.PhoneOptions[i].IsOptionSelected"&gt;@Model.PhoneOptions[i].OptionName&lt;/label&gt; 和 2)&lt;label asp-for="@cbId"&gt;@Model.PhoneOptions[i].OptionName&lt;/label&gt; 不可单击以切换复选框值。如果你知道怎么做,那就太好了!
  • 您需要删除id 属性(事实上,它的id="@cbId" 表明它甚至不是唯一的,因此您创建的html 无效。-&lt;input asp-for="@Model.PhoneOptions[i].IsOptionSelected" type="checkbox" /&gt;&lt;label asp-for="@Model.PhoneOptions[i].IsOptionSelected"&gt;@Model.PhoneOptions[i].OptionN‌​ame&lt;/label&gt;
  • @StephenMuecke。这实际上是我尝试的第一件事,最初它不起作用。这就是为什么我求助于手动 id 分配(它实际上是独一无二的,因为它 OptionIds 是独一无二的)但我知道这不是一个非常优雅的解决方案。现在我把它改回你也建议她的东西,现在它可以工作了! (抓头)。一定是我有其他东西阻止标签附加到复选框。不过非常感谢!
【解决方案2】:

这就是每个 asp-for 中的语法应该用引号括起来的字符串

 @foreach (var option in Model.PhoneOptions)
        {
            <div>
                @{ string cbId = "PhoneOption_" + @option.OptionId; }
                <input asp-for="@option.IsOptionSelected" type="checkbox" value="@option.IsOptionSelected" id="@cbId" name="@cbId" />
                @Html.Label(@cbId.ToString(), @option.OptionName)
                @*This is causing invalid operation exception*@
                @*<label asp-for="@cbId">@option.OptionName</label>*@ 
                <span asp-validation-for="@cbId" class="text-danger" role="alert"></span>
            </div>
        }

【讨论】:

  • 抱歉,我试过了,但 IsOptionSelected 值仍然在控制器中发布为 false,即使选中了复选框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 2012-05-19
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多