Html .CheckBoxFor возврат неверного значения, если изначально не отмечен - PullRequest
0 голосов
/ 18 июня 2020

У меня есть ViewModel, содержащий информацию об объекте ContactEvent. ContactEvent имеет логическое значение IsActive. Я использую @Html.CheckBoxFor() для флажка, чтобы пользователь мог изменять его значение. Проблема в том, что если значение изначально истинно, а пользователь устанавливает его как false, модель, прошедшая через POST, имеет обновленное значение. Но если значение изначально ложно, модель, прошедшая через POST, всегда возвращает ложь. Понятия не имею, что его вызывает.

Просмотр

@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>

Метод в контроллере

[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 });
       }

Пусть я знаю, нужен ли вам другой код. Заранее спасибо.

1 Ответ

1 голос
/ 19 июня 2020

Удалите @Value = Model.ContactEvent.IsActive. Это позволит вашей модели правильно обрабатывать значение. Не устанавливайте никаких значений, если вы не уверены, что хотите переопределить поведение модели.

...