Make Html.CheckBoxFor return an integer
我想将一个复选框绑定到ASP.net MVC中的一个整数(如下所示的ISACTIVE值)。
1
| @Html .CheckBoxFor(model => model .ISACTIVE, new { htmlAttributes = new { @ class ="form-control" } }) |
我知道Html.CheckBoxFor仅接受bool作为输入,并且可以在模型上添加新属性,但是我使用的是已经存在的数据库,并且每次更新时,都会刷新模型。
是否有一种为CheckBoxFor创建新方法的方法,该方法将根据是否选中该框来返回整数?
- 使用具有布尔属性的视图模型(并且只能将CheckBoxFor()用于布尔属性)
-
在发送模型时,为什么不只返回布尔值...我的意思是对于正数,除了0时发送True,对于0时发送False。
-
@StephenMuecke我不能这样做,因为每次数据库更新时,我的模型都会恢复到其原始状态。我正在寻找一种方法来更改原始的CheckBoxFor方法或添加一个新的类似方法,以将布尔输入更改为整数。
-
@TusharGupta我假设您建议我添加一个新的帮助方法,将int更改为bool?那会很好,但是我如何使上面的代码行那样工作?
-
视图模型不是数据模型。什么是MVC中的视图模型。每个视图都应该有一个视图模型!
-
不,@ NikolMarg我说例如ISACTIVE是一个正整数,然后添加一个属性Boolean属性并将其分配为True并使用复选框绑定hat新属性
-
@StephenMuecke到目前为止,我没有所有视图的视图模型,因为这些视图直接使用从实体框架创建的模型。我想我可以为此特定视图创建视图模型,但这并不是我要尝试做的。
-
@NikolMarg,但是那不是我要做什么?所以,您是说您希望网站失败!
-
@StephenMuecke Wow迅速升级
-
@NikolMarg能否给我们更多代码?我们真的需要看你的实体
-
为模型添加布尔属性:
1 2 3 4 5 6 7
| public bool BoolValue
{
get { return IntValue == 1; }
set { IntValue = value ? 1 : 0;}
}
public int IntValue { get; set; } |
编辑:
您也可以手动创建复选框控件:
1
| @Html .CheckBox("IsActive", Model .IsActive ? true : false, new { htmlAttributes = new { @ class ="form-control" } }) |
如果名称与MVC先前生成的名称匹配,则该值应返回到控制器操作。也许您必须定义自己的自定义值提供程序,才能将bool转换为int,类似于:如何将ASP.Net MVC路由段中的1或0映射到布尔操作方法输入参数
434511
选项1
由于您无法向实体添加新属性,为什么不检查动作中的布尔值?
1 2 3 4 5 6 7 8
| public ActionResult Test(bool isActive)
{
int test = isActive ? 1 : 0;
return View();
} |
选项2
创建您自己的视图模型,该模型检查布尔值,然后创建新的实体记录。
型号
1 2 3 4 5 6 7 8 9
| public class NikolsModel
{
[Required]
public bool IsActive { get; set; }
// Other Properties...
} |
动作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public async Task <ActionResult > Index (NikolsModel model )
{
if (ModelState .IsValid)
{
//
// Create a new instance of your entity
//
var record = new NikolsEntity
{
IsValid = model .IsActive ? 1 : 0,
//Other properties from model
};
DbContext .NikolsEntity.add(record );
await DbContext .SaveChangesAsync();
return RedirectToAction ("Index");
}
//Something went wrong, return the view with model errors
return View (model );
} |
434511
您也可以尝试将简单的HTML input控件用于复选框类型。这样,您可以为其分配一些值或名称,并将其也返回给控制器。
这可能与您要实现的目标不完全相同。它会给你一个想法。
您认为:
1
| <input type="checkbox" id="yourId" name="selectedIds" value="@menu.Id"/> |
在您的控制器中,您可以尝试访问此特定控件的值,如下所示:
1
| value = Request.Form["selectedIds"]; |
希望这会有所帮助。
434511
1
| @Html.CheckBoxFor(model => model.Modelname) |
,然后在您的控制器中:
1 2 3 4 5 6 7
| var isChecked = Request.Form["Modelname"];
if(!isChecked.Equals("false"))
{
//Checkbox is checked, do whatever you want!
} |
1
| @Html.CheckBoxFor(model => model.Modelname) |
,然后在您的控制器中:
1 2 3 4 5 6 7
| var isChecked = Request.Form["Modelname"];
if(!isChecked.Equals("false"))
{
//Checkbox is checked, do whatever you want!
} |
您也可以尝试将简单的HTML input控件用于复选框类型。这样,您可以为其分配一些值或名称,并将其也返回给控制器。
这可能与您要实现的目标不完全相同。它会给你一个想法。
您认为:
1
| <input type="checkbox" id="yourId" name="selectedIds" value="@menu.Id"/> |
在您的控制器中,您可以尝试访问此特定控件的值,如下所示:
1
| value = Request.Form["selectedIds"]; |
希望这会有所帮助。
-
这似乎是一个干净的解决方案,但是当我尝试在选中复选框的情况下提交表单时,我不断收到" true值对Active无效"错误。如果未选中它,则可以正常工作。我到处寻找解决方案,但是我不断发现此错误。
-
没关系,我想通了,它现在可以正常运行了。谢谢!在我的视图中,我添加了<input type="checkbox" name="myCheckbox" id="myCheckbox" value="1" >,在我的控制器上,我使用了if (myCheckbox[0] =="1") active= 1;
-
做得好 !乐意效劳。谢谢,
选项1
由于您无法向实体添加新属性,为什么不检查动作中的布尔值?
1 2 3 4 5 6 7 8
| public ActionResult Test(bool isActive)
{
int test = isActive ? 1 : 0;
return View();
} |
选项2
创建您自己的视图模型,该模型检查布尔值,然后创建新的实体记录。
型号
1 2 3 4 5 6 7 8 9
| public class NikolsModel
{
[Required]
public bool IsActive { get; set; }
// Other Properties...
} |
动作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public async Task <ActionResult > Index (NikolsModel model )
{
if (ModelState .IsValid)
{
//
// Create a new instance of your entity
//
var record = new NikolsEntity
{
IsValid = model .IsActive ? 1 : 0,
//Other properties from model
};
DbContext .NikolsEntity.add(record );
await DbContext .SaveChangesAsync();
return RedirectToAction ("Index");
}
//Something went wrong, return the view with model errors
return View (model );
} |
-
这是有道理的,但是model => model.ISACTIVE仍然会返回错误,因为ISACTIVE是一个int。
-
可以用脚本吗?您如何使用表单或Ajax创建请求?
-
我认为有表格。像 @Html.LabelFor(model => model.ISACTIVE, htmlAttributes: new { @class ="control-label " }) @Html.CheckBoxFor(model => model.ISACTIVE, new { htmlAttributes = new { @class ="form-control" } }) @Html.ValidationMessageFor(model => model.ISACTIVE,"", new { @class ="text-danger" })
为模型添加布尔属性:
1 2 3 4 5 6 7
| public bool BoolValue
{
get { return IntValue == 1; }
set { IntValue = value ? 1 : 0;}
}
public int IntValue { get; set; } |
编辑:
您也可以手动创建复选框控件:
1
| @Html .CheckBox("IsActive", Model .IsActive ? true : false, new { htmlAttributes = new { @ class ="form-control" } }) |
如果名称与MVC先前生成的名称匹配,则该值应返回到控制器操作。也许您必须定义自己的自定义值提供程序,才能将bool转换为int,类似于:如何将ASP.Net MVC路由段中的1或0映射到布尔操作方法输入参数
- 我已经解释了为什么那不可能。每次数据库更新时,我的模型都会恢复为原始模型,因此无法添加更多属性。