0

我有一个 ViewModel,其中包含一个名为 ContactEvent 的对象的信息。ContactEvent 有一个名为 IsActive 的布尔值。我正在使用@Html.CheckBoxFor()复选框让用户更改其值。问题是,如果该值最初为 true,而用户将其设置为 false,则通过 POST 传递的模型具有更新后的值。但是,如果该值最初为 false,则通过 POST 传递的模型仍然始终返回 false。我不知道是什么原因造成的。

看法

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

如果您需要任何其他代码,请告诉我。提前致谢。

4

1 回答 1

1

请删除 @Value = Model.ContactEvent.IsActive。这将使您的模型正确处理该值。除非您确定要覆盖模型行为,否则不要设置任何值。

于 2020-06-18T21:38:08.730 回答