【问题标题】:Input type checkbox with MVC razor带有 MVC 剃须刀的输入类型复选框
【发布时间】:2016-11-10 21:48:16
【问题描述】:

为什么我的复选框的值没有传递给我的 ViewModel?

我的观点(我省略了与这篇文章无关的输入标签):

@model Pro.WebUI.ViewModels.UserViewModel

@using (Html.BeginForm("ManageUsers", "Administration", FormMethod.Post, 
new { id = "request-form", @class = "form-horizontal" }))
{
 <div class="form-group">
  <label for="inputAuthorize" class="col-lg-2 control-label">Authorize</label>
   <div class="col-lg-8">
     <input type="checkbox" id="Authorized" name="Authorized" value="@Model.Authorized" />
   </div>
 </div>
 <div class="form-group">
  <div class="col-lg-10 col-lg-offset-2">
   <br /><br />
   <button type="submit" class="btn btn-primary">Submit Request</button>
   </div>
 </div>
 }

我的视图模型:

public class UserViewModel
{
    [Key]
    public string UserID { get; private set; }

    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Authorized { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string Notes { get; set; }
}

我的控制器:

 [HttpPost]
    public ActionResult ManageUsers(UserViewModel model)
    {
        if (ModelState.IsValid)
        {
            ProcurementUser obj = new ProcurementUser();
            obj.UserName = model.Email;
            obj.FirstName = model.FirstName;
            obj.LastName = model.LastName;
            obj.Email = model.Email;
            obj.Phone = model.Phone;
            obj.Authorized = model.Authorized;
            UserRepository.SaveUser(obj);
            //success message
        }
        return View(model);
    }

我没有包含所有输入标签,但是当我在没有复选框的情况下单步执行代码时,所有值都被传递。我查看了关于 SOF 的其他复选框问题,但它们主要使用 @Html.Checkbox 或 @Html.CheckboxFor。我只想使用 input type="checkbox"

【问题讨论】:

  • 未选中的复选框不会回发。强类型帮助器生成您的 html 有一个很好的理由 - 他们做得正确!
  • Html.Checkbox 或 Html.CheckboxFor 创建一个复选框输入...但生成执行此操作所需的所有代码(ID 生成它必须是,并且还有一个具有相同名称的 Hidden 来处理未选中框)。
  • 我还建议您检查实际生成的 html(特别是 truefalse 情况下的 value 属性),它应该变得清晰。 &lt;label for="inputAuthorize" ...&gt; 的意义何在 - 你的复选框有 name="Authorized",而不是 name="inputAuthorize"!始终使用强类型的 html 助手!
  • @StephenMuecke,很好的信息,谢谢。标签只是引导模板的一部分。
  • @Romias 更多好信息,我不知道 Hidden。

标签: asp.net-mvc razor checkbox viewmodel form-submit


【解决方案1】:

如果我们需要使用&lt;input&gt; 字段而不是@Html.CheckboxFor,我们可以使用"checked=\"checked\"" 语法,如下代码:

<input type="checkbox" id="Authorized" name="Authorized" value="true" @(Model.Authorized ? "checked=\"checked\"" : "") />

【讨论】:

  • 有趣。你是怎么知道的?!
  • @JoshYates1980,其实我是在关注asp.net tutorial 时发现的。往下看教程底部。
【解决方案2】:

正如 cmets 中所暗示的,您遇到的问题是您并没有真正正确地创建您的复选框:

假设您的模型有Authorized = true,您的标记将是:

<input type="checkbox" id="Authorized" name="Authorized" value="true" />

false 状态同样会导致:

<input type="checkbox" id="Authorized" name="Authorized" value="false" />

但这些不是“选中”复选框 - 它们仍然是“未选中”,并且需要 checked 属性设置:

<input type="checkbox" id="Authorized" name="Authorized" value="true" checked />

正如 Stephen 指出的那样 - 未选中的复选框不会将任何数据发送回服务器,这样您就不会混淆选择了哪些选项。

最后,如前所述,您的&lt;label&gt; 元素用于寻找inputAuthorize 而不是Authorized 的不存在字段。

如果您要使用 @Html.CheckboxFor@Html.LabelFor 辅助类,所有这些问题都会为您解决。

【讨论】:

  • 感谢您提供的所有好信息。我将实现@Html.Checkboxfor.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多