首页 > 解决方案 > .net 核心复选框模型绑定视图

问题描述

我是编程新手,非常感谢您的英语帮助。我的 ms sql 数据库中有一个字段,比如“city”,它的数据类型是“string”。我的 asp.net 核心 mvc 中有“悉尼”、“伦敦”、“柏林”、“德里”的复选框。现在,当用户选择“悉尼”和“伦敦”时,我希望将数据(在“城市”下)存储为“悉尼,伦敦”。基本上我想序列化(逗号分隔)视图数据并将其存储在字段下并稍后对其进行反序列化以将其显示在视图中。我来了,在视图中的“城市”下存储一个值并检索它,然后在我的视图中显示回来。不知道如何做多个值。我不确定该怎么做/怎么做。任何指导将不胜感激。

下面是我如何存储我的单个值的视图代码,

 <div class="form-group my-2">
            <div class="btn-group btn-group-toggle" data-toggle="buttons">
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="Sydney"> Sydney
                </label>
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="London"> London
                </label>
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="Berlin"> Berlin
                </label>
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off"  value="Delhi"> Delhi
                </label>
               </div>
        </div>

我的模型文件具有如下声明的字段,

public string city {get; set;}

我的控制器收到这样的物品,

public async Task<IActionResult> Edit(string id, [Bind("city")] RNote rNote)
{
  return View(rNote);
}

如果我必须阅读一些主题才能理解您的答案,请在您的答案中列出。谢谢你。

标签: c#.netasp.net-mvcasp.net-core

解决方案


要将多个值绑定到字符串类型的属性,您可以自定义模型绑定,如下所示:

public class CustomModelBinder: IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)

            throw new ArgumentNullException(nameof(bindingContext));
        var values = bindingContext.ValueProvider.GetValue("city");

        if (values.Length == 0)
            return Task.CompletedTask;

        var result = new RNote
        {
            city = values.ToString()
        };
          bindingContext.Result = ModelBindingResult.Success(result);

        return Task.CompletedTask;
    }

}

控制器:

public async Task<IActionResult> Edit(int id, [ModelBinder(BinderType = typeof(CustomModelBinder))] RNote rNote)

看法:

<form asp-action="Edit">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <input type="hidden" asp-for="Id" />
        <div class="form-group my-2">
            <div class="btn-group btn-group-toggle" data-toggle="buttons">
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="Sydney"> Sydney
                </label>

                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="London"> London
                </label>
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="Berlin"> Berlin
                </label>
                <label class="btn btn-outline-primary">
                    <input type="checkbox" name="city" autocomplete="off" value="Delhi"> Delhi
                </label>
            </div>
        </div>
        <div class="form-group">
            <input type="submit" value="Save" class="btn btn-primary" />
        </div>
</form>

参考:

https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-3.1


推荐阅读