gpt4 book ai didi

c# - MVC 5 复选框返回 “False,false” 或 “false”

转载 作者:太空狗 更新时间:2023-10-29 23:30:11 27 4
gpt4 key购买 nike

乍一看,这篇文章可能看起来像是重复的,但事实并非如此。相信我,我已经查看了所有 Stack Overflow,但都无济于事。

无论如何,我从 Html.CheckBoxFor 得到了一些奇怪的行为。

我有一个具有以下定义属性的 View 模型

[Display(Name = "User is active")]
public bool IsActive { get; set; }

在view之前初始化

if (userInfo.isActive != null)
{
//Cast to bool because userInfo.isActive is Nullable<bool>
model.IsActive = (bool)userInfo.isActive;
}

ModelState.Clear();

return View(model);

然后在 Html.BeginForm 中呈现为

<div class="form-group">
@Html.LabelFor(model => model.IsActive, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.CheckBoxFor(model => model.IsActive, htmlAttributes: new { @value = Model.IsActive /*Also tried @checked = Model.IsActive*/ })
@Html.ValidationMessageFor(model => model.IsActive)
</div>
</div>

并返回给 Controller

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EditProfile(EditProfileViewModel model, string Roles, HttpPostedFileBase ProfileImage)
{
//There's a lot more up here, but it's not relevant to the problem
userInfo.isActive = model.IsActive;
var tmp = Request.Form["IsActive"]; //Added just to check the form value

try
{
db.Entry(userInfo).State = EntityState.Modified;
//Assign changed data to userInfo
db.SaveChanges();
}
}

当 model.IsActive 初始化为 true 并且我没有取消选中复选框时, Controller 帖子中 model.IsActive 的值为 true,或者如果我取消选中该复选框,则 model.IsActive 的值返回为 false一切都很好。

当 model.IsActive 初始化为 false 时会出现问题。我读了很多 Stack Overflow 帖子,解释说如果复选框未选中,则返回“false”,如果选中,则返回“true,false”,但这不是我得到的行为。当复选框初始化为 false 并且我在 View 中检查它时,model.IsActive 的值仍然返回 false 并且当我检查表单元素的值时(请参阅 Controller 帖子中的“var tmp”)它是“false,false” . “True,false”是期望值,不是吗?这仅在尝试将模型值从 false 更改为 true 时发生,从 true 更改为 false 没有问题。

那么 Stack Overflow,到底发生了什么?!

最佳答案

您不需要更改复选框的 value 属性。如果你在没有它的情况下使用助手,你会看到

@Html.CheckBoxFor(model => model.IsActive)

被渲染到

<input data-val="true" data-val-required="The IsActive field is required." id="IsActive" name="IsActive" type="checkbox" value="true" class="valid">

您可以看到,虽然 Model.IsActive 设置为 false,但输入的值属性仍然是 true

顺便说一下,如果您查看 CheckBox 助手的源代码,您会发现 value=true 是硬编码的(因此您不应该更改它):

private static MvcHtmlString CheckBoxHelper(HtmlHelper htmlHelper, ModelMetadata metadata, string name, bool? isChecked, IDictionary<string, object> htmlAttributes)
{
RouteValueDictionary attributes = ToRouteValueDictionary(htmlAttributes);

bool explicitValue = isChecked.HasValue;
if (explicitValue)
{
attributes.Remove("checked"); // Explicit value must override dictionary
}

return InputHelper(htmlHelper,
InputType.CheckBox,
metadata,
name,
value: "true",
useViewData: !explicitValue,
isChecked: isChecked ?? false,
setId: true,
isExplicitValue: false,
format: null,
htmlAttributes: attributes);
}

关于c# - MVC 5 复选框返回 “False,false” 或 “false”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com