jeudi 18 juin 2020

Html.CheckBoxFor Returning Incorrect Value If Originally Unchecked

I have a ViewModel containing information for an object called ContactEvent. ContactEvent has a boolean called IsActive. I'm using @Html.CheckBoxFor() for a checkbox to let the user alter its value. The problem is that if the value is originally true and the user sets it to false, the model passed through the POST has the updated value. But if the value is originally false, the model passed through the POST always returns false still. I have no idea what is causing it.

View

@model ContactEventViewModel

@{
    ViewBag.Title = "Contact Event";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<head>
    <script src="~/datatables/js/jquery.dataTables.min.js"></script>
    <link rel="stylesheet" href="~/datatables/css/jquery.dataTables.min.css" />
</head>

<body>

    <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12">
        @using (Html.BeginForm("ContactEvent", "ContactEvents", FormMethod.Post))
        {
            <h1>Edit Contact Event</h1>
            @Html.HiddenFor(Model => Model.ContactEvent.ContactEventSysID, new { @Value = Model.ContactEvent.ContactEventSysID })
            <div class="form-group row">
                <label>Customer</label>
                <div class="col-md-7 col-lg-7">
                    <Label>@String.Format("{1}, {0}", Model.Customer.FirstName, Model.Customer.LastName)</Label>
                    @Html.HiddenFor(Model => Model.Customer.CustomerSysID, new { @Value = Model.Customer.CustomerSysID })
                </div>
            </div>
            <div class="form-group row">
                <label>Date</label>
                <div class="col-md-7 col-lg-7">
                    @Html.EditorFor(model => model.ContactEvent.Date, new { htmlAttributes = new { @class = "datepicker", @Name = "date", @PlaceHolder = "mm/dd/yyyy" } })
                </div>
            </div>
            <div class="form-group row">
                <label>Event Type</label>
                <div class="col-md-7 col-lg-7">
                    @Html.DropDownListFor(Model => Model.ContactEvent.ContactEventTypeSysID, new SelectList(Model.ListOfContactEventTypes, "ContactEventTypeSysID", "Description"))
                </div>
            </div>
            <div class="form-group row">
                <label>Outcome</label>
                <div class="col-md-7 col-lg-7">
                    @Html.DropDownListFor(Model => Model.ContactEvent.OutcomeSysID, new SelectList(Model.ListOfOutcomes, "OutcomeSysID", "Description"))
                </div>
            </div>
            <div class="form-group row">
                <label>Note</label>
                <div class="col-md-7 col-lg-7">
                    @Html.TextBoxFor(Model => Model.ContactEvent.Note, new { @Value = Model.ContactEvent.Note })
                </div>
            </div>
            <div class="form-group row">
                <label>Created Date</label>
                <div class="col-md-7 col-lg-7">
                    <label>@Model.ContactEvent.CreatedDate</label>
                </div>
            </div>
            <div class="form-group row">
                <label>Last Updated Date</label>
                <div class="col-md-7 col-lg-7">
                    <label>@Model.ContactEvent.LastUpdatedDate</label>
                </div>
            </div>
            <div class="form-group row">
                <label>Active?</label>
                <div class="col-md-7 col-lg-7">
                    @Html.CheckBoxFor(Model => Model.ContactEvent.IsActive, new { @Value = Model.ContactEvent.IsActive })
                </div>
            </div>
            <input type="submit" id="updateButton" value="Submit" />
        }

    </div>
</body>

Method in Controller

[HttpPost]
        public IActionResult ContactEvent(ContactEventViewModel contactEventViewModel) 
        {
            if (ModelState.IsValid)
            {
                string connectionString = Startup.ConnectionString;
                string query = "UPDATE [CRM].[dbo].[ContactEvent] " +
                            "SET [Date]=@Date, [ContactEventTypeSysID]=@ContactEventTypeSysID, [OutcomeSysID]=@OutcomeSysID, [Note]=@Note, [LastUpdatedDate]=@LastUpdatedDate, [IsActive]=@IsActive " +
                            "WHERE [ContactEventSysID]=@ContactEventSysID";
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    using (SqlCommand command = new SqlCommand(query, connection))
                    {
                        command.Parameters.AddWithValue("@Date", contactEventViewModel.ContactEvent.Date);
                        command.Parameters.AddWithValue("@ContactEventTypeSysID", contactEventViewModel.ContactEvent.ContactEventTypeSysID);
                        command.Parameters.AddWithValue("@OutcomeSysID", contactEventViewModel.ContactEvent.OutcomeSysID);
                        if (contactEventViewModel.ContactEvent.Note == null)
                        {
                            command.Parameters.AddWithValue("@Note", DBNull.Value);
                        }
                        else
                        {
                            command.Parameters.AddWithValue("@Note", contactEventViewModel.ContactEvent.Note);
                        }
                        command.Parameters.AddWithValue("@LastUpdatedDate", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                        command.Parameters.AddWithValue("@IsActive", contactEventViewModel.ContactEvent.IsActive);
                        command.Parameters.AddWithValue("@ContactEventSysID", contactEventViewModel.ContactEvent.ContactEventSysID);

                        connection.Open();
                        command.ExecuteNonQuery();
                    }
                }
            }
            return RedirectToAction("ContactEvent", "ContactEvents", new { ContactEventSysID = contactEventViewModel.ContactEvent.ContactEventSysID });
       }

Let me know if you need any other code. Thanks in advance.




Aucun commentaire:

Enregistrer un commentaire