在MVC 6中,如何在视图中编码复选框列表并将选中的值传递给控制器​​?

时间:2016-04-26 04:49:29

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

很抱歉,但我的大多数搜索都会将我带到旧的MVC代码中。任何帮助将不胜感激。

在带有标记帮助程序的MVC 6中,如何编写一组复选框:

  • 使用标记帮助程序标记,因此单击它将切换选中的值
  • 将选中的值保存(绑定?)到IsOptionSelected属性
  • 点击提交
  • 后,将这些选中的值传回Controller

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

我还能够为标签工作制作html帮助器,但不能为标签帮助器制作。我可能也将这些错误编码,所以任何提示都会有所帮助!

这是我到目前为止所拥有的:

显示:

Phone Options Checkboxes

实体:

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>

提前致谢!

2 个答案:

答案 0 :(得分:9)

这最终是我做的工作。我不确定这是否是最好的方法。我不得不仍然使用html助手,因为标记助手不起作用。

<强>型号:

UsernamePasswordAuthenticationFilter

查看

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

我希望这有助于其他拥有相同复选框列表问题的人。

<强>更新 我已经更新了html助手以标记上面的助手。

答案 1 :(得分:0)

这就是你的每个 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>
        }