SteinTech
SteinTech

Reputation: 4068

how to get multiple checkbox values in ASP.NET Core

I want to get the id's of all selected items, but I only get the first one in the action in the controller. I expected the values to come as a comma-separated list, but no.

Code:

@foreach (ICulture cult in await _genRepo.GetCulturesAsync())
{
    <label>
        <input type="checkbox" name="lang" id="lang" value="@cult.Id" /> @cult.DisplayName
    </label>
}

Controller action method:

[HttpPost("siteAPI/SaveSiteLanguageAsync")]
public async Task<IActionResult> SaveSiteLanguageAsync([FromForm] Guid app, [FromForm] string lang) 
{
    ...
}

Upvotes: 1

Views: 2422

Answers (1)

mj1313
mj1313

Reputation: 8479

If you want to accept a list, you can just use a array or a list to accept it

[HttpPost("siteAPI/SaveSiteLanguageAsync")]
public async Task<IActionResult> SaveSiteLanguageAsync([FromForm] Guid app, [FromForm] 
string[] lang) 
{
   ...
}

And if you want to accept a comma-separated string, you can use custom model binding.

Below is an example:

LangBinder:

public class LangBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var langs = bindingContext.ValueProvider.GetValue("lang");

        if (langs == ValueProviderResult.None)
        {
            return Task.CompletedTask;
        }

        string langlist = string.Join(",", langs);
        
        bindingContext.Result = ModelBindingResult.Success(langlist);
        return Task.CompletedTask;
    }
}

Controller action:

[HttpPost("siteAPI/SaveSiteLanguageAsync")]
public async Task<IActionResult> SaveSiteLanguageAsync([FromForm] Guid app, [ModelBinder(typeof(LangBinder))] string lang) 
{
    ...
}

Upvotes: 2

Related Questions