Search code examples
c#asp.net-core-mvcrazor-pages

checkboxfor always return false


I have weird issue regarding binding a checkboxfor.

public async Task<IActionResult> Save(TblCoordinators tb)    
{
    try
    {
        tb.Modified = DateTime.UtcNow;
      
        _context.TblCoordinators.Update(tb);
        await _context.SaveChangesAsync();
        _toastNotification.AddSuccessToastMessage("Data has been updated successfully");
       
        return PartialView("_Edit",ModelView);
    }
    catch(Exception ex)
    {
        _toastNotification.AddErrorToastMessage("Something went wrong.");
        return NoContent();
    }  
}

and in my view I have

<form asp-action="Save"
      data-ajax="true"
      data-ajax-method="POST"
      data-ajax-mode="replace"
      data-ajax-update="#edit"
      method="post">

    <div class="border">
        <div class="row">
            <div class="col-12">
                <h5 class="heading">Main Details</h5>
            </div>

            <div class="col-12">
                <div class="row p-2">
                    <div class="col-6">
                        <div class="form-group">
                            <label class="control-label">Title</label>
                            <input asp-for="@Model.infoList[0].title" class="form-control" name="Title" required />
                            <input type="hidden" asp-for="@Model.infoList[0].coordinatorID" class="form-control" name="coordinatorID"  />
                            <input type="hidden" asp-for="@Model.infoList[0].created" class="form-control" name="created"  />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                Contact Name
                            </label>
                            <input asp-for="@Model.infoList[0].contactName" class="form-control" name="contactName" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                Telephone
                            </label>
                            <input asp-for="@Model.infoList[0].telephone" class="form-control" name="telephone" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                Active
                            </label>
                            @Html.CheckBoxFor(x=>x.infoList[0].active, new { @class= "form-check-input" })
                        </div>
                        <button type="submit" class="btn btn-primary w-50 ">Save</button>
                    </div>
                    <div class="col-6">
                        <div class="form-group">
                            <label class="control-label">
                                Address Line 1
                            </label>
                            <input asp-for="@Model.infoList[0].addressLine1" class="form-control" name="addressLine1" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                address Line 2
                            </label>
                            <input asp-for="@Model.infoList[0].addressLine2" class="form-control" name="addressLine2" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                City
                            </label>
                            <input asp-for="@Model.infoList[0].addressCity" class="form-control" name="addressCity" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                County
                            </label>
                            <input asp-for="@Model.infoList[0].addressCounty" class="form-control" name="addressCounty" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">
                                Postcode
                            </label>
                            <input asp-for="@Model.infoList[0].addressPostcode" class="form-control" name="addressPostcode" />
                        </div>
                    </div>
                </div>
            </div>

        </div>
    </div>
</form>

I am getting all data correct except the bool value for checkBox!!
I did a similar thing before for checkBox but in this case, I don't know why it is not working. Also, I have tried to get its value from this:

<input type="checkbox" name="x" />

and in the controller like this :

public async Task<IActionResult> Save(TblCoordinators tb, bool x)

but it is still always false!!


Solution

  • I think you may have misunderstood the checkbox.

    In type=checkbox name=x,If the value attribute was omitted, the default value for the checkbox is on, so the submitted data in that case would be x=on instead of true or false.

    You can see checkbox in doc.

    In your case,below is a simple demo.You can check it.

    Model:

     public class info
    {
        public string contactName { get; set; }
        public bool active { get; set; }
    }
    public class TblCoordinators
    {
        public List<info> infoList { get; set; }
    }
    

    Index View:

    @model TblCoordinators
    
    <form asp-action="Save" method="post">
    <div class="form-group">
        <label class="control-label">
            Contact Name
        </label>
        <input asp-for="@Model.infoList[0].contactName" class="form-control" />
    </div>
    <div class="form-group">
        <label class="control-label">
            Active
        </label>
            @Html.CheckBoxFor(x => x.infoList[0].active, new { @class = "form-check-input" })
    </div>
    <input type="submit" value="Save" />
    </form>
    

    Action:

     public IActionResult Index()
        {
          
            return View();
        }
        
        [HttpPost]
        public IActionResult Save(TblCoordinators tb)
        {
            //....
            return View("Index");
        }
    

    Test result: enter image description here