0

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.

4
  • Remove @Value = Model.ContactEvent.IsActive Commented Jun 18, 2020 at 20:55
  • @Adlorem that worked... I thought that line was necessary to input the existing value from the model. Commented Jun 18, 2020 at 21:02
  • No, by setting it manually you are overriding model. Commented Jun 18, 2020 at 21:21
  • @Adlorem would you like to post answer so I can accept it? Commented Jun 18, 2020 at 21:34

1 Answer 1

1

Please remove @Value = Model.ContactEvent.IsActive. This will let your model properly handle the value. Do not set any values unless you are sure, that you want to override model behavior.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.