【问题标题】:Make Html.CheckBoxFor return an integer使 Html.CheckBoxFor 返回一个整数
【发布时间】:2015-06-26 22:12:12
【问题描述】:

我想在 ASP.net MVC 中将一个复选框绑定到一个整数(如下所示的 ISACTIVE 值)。

@Html.CheckBoxFor(model => model.ISACTIVE, new { htmlAttributes = new { @class = "form-control" } })

我知道 Html.CheckBoxFor 只接受 bool 作为输入,我可以在我的模型上添加一个新属性,但我使用的是已经存在的数据库,每次更新时,模型都会刷新。

有没有办法为 CheckBoxFor 创建一个新方法,该方法将根据复选框是否被选中返回一个整数?

【问题讨论】:

  • 使用具有布尔属性的视图模型(并且您只能将CheckBoxFor() 用于布尔属性)
  • 在发送模型时为什么不只返回 bool ...我的意思是除了 0 发送 True 和 0 发送 False 以外的正数。
  • @StephenMuecke 我不能这样做,因为每次数据库更新时我的模型都会恢复到原始状态。我正在寻找一种方法来更改原始 CheckBoxFor 方法或添加一个新的类似方法,将 bool 输入更改为整数。
  • @TusharGupta 我假设你建议我添加一个新的帮助方法,将 int 更改为 bool?那会很好,但是我怎样才能让上面的代码行那样工作呢?
  • 视图模型不是数据模型。 What is a view model in MVC。每个视图都应该有一个视图模型!

标签: c# asp.net asp.net-mvc checkbox html.checkbox


【解决方案1】:

您也可以尝试对复选框类型使用简单的 HTML input 控件。这样,您可以为其分配一些值或名称,并将其返回给控制器。

这可能不是您想要实现的确切目标。不过,它会给你一个想法。

在你看来:

<input type="checkbox" id="yourId" name="selectedIds" value="@menu.Id"/>

在您的控制器中,您可以尝试访问此特定控件的值,如下所示:

value = Request.Form["selectedIds"];

希望这会有所帮助。

【讨论】:

  • 这似乎是一个干净的解决方案,但是当我尝试在选中复选框的情况下提交表单时,我不断收到“值 'true' 对 Active 无效”错误。当它未选中时,它工作正常。我四处寻找解决方案,但我不断收到此错误的变体。
  • 没关系,我想通了,现在可以完美运行了。谢谢!在我看来,我添加了 &lt;input type="checkbox" name="myCheckbox" id="myCheckbox" value="1" /&gt; 在我的控制器上,我得到了 if (myCheckbox[0] == "1") active= 1; 的值
  • 伟大的工作!乐意效劳。谢谢,
【解决方案2】:

选项 1

既然您无法向实体添加新属性,为什么不直接检查操作中的 bool 值?

public ActionResult Test(bool isActive)
{

    int test = isActive ? 1 : 0;


    return View();
}   

选项 2

创建您自己的视图模型来检查布尔值,然后创建一个新的实体记录。

型号

public class NikolsModel
{

    [Required]
    public bool IsActive { get; set; }

    // Other Properties...

}

动作

    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 =&gt; model.ISACTIVE 仍然会返回错误,因为 ISACTIVE 是一个 int。
  • 你能用脚本来做吗?您是如何创建请求的,使用表单还是使用 Ajax?
  • 在我看来有一个表格。喜欢&lt;div class="form-group"&gt; @Html.LabelFor(model =&gt; model.ISACTIVE, htmlAttributes: new { @class = "control-label " }) &lt;div&gt; @Html.CheckBoxFor(model =&gt; model.ISACTIVE, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model =&gt; model.ISACTIVE, "", new { @class = "text-danger" }) &lt;/div&gt; &lt;/div&gt;
【解决方案3】:

为您的模型添加 bool 属性:

public bool BoolValue
{
    get { return IntValue == 1; }
    set { IntValue = value ? 1 : 0;}
}

public int IntValue { get; set; }

编辑:

您也可以手动创建复选框控件:

@Html.CheckBox("IsActive", Model.IsActive ?  true : false,  new { htmlAttributes = new { @class = "form-control" } }) 

如果 name 与 MVC 先前生成的 name 匹配,则该值应返回到控制器操作。也许您必须定义自己的自定义值提供程序才能从 bool 转换为 int,类似于:How to map a 1 or 0 in an ASP.Net MVC route segment into a Boolean action method input parameter

【讨论】:

  • 我已经在我的问题中解释了为什么这不可能。每次数据库更新时,我的模型都会恢复为原始模型,因此我无法添加更多属性。
【解决方案4】:
@Html.CheckBoxFor(model => model.Modelname)

然后,在您的控制器中:

var isChecked = Request.Form["Modelname"];

if(!isChecked.Equals("false"))
{
//Checkbox is checked, do whatever you want!

}

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多