【问题标题】:Why doesn't my checkbox map to an MVC model member?为什么我的复选框没有映射到 MVC 模型成员?
【发布时间】:2012-05-18 10:36:31
【问题描述】:

我正在尝试实现 this answer suggests,但没有将显示名称存储在我的模型代码中,所以我认为这是一个单独的问题。

我有一个 MVC 视图

<%@ Page Language="C#" MasterPageFile="PathToMaster" Inherits="System.Web.Mvc.ViewPage<ModelData>" %>

还有一个模型:

public class ModelData {
    public bool Option1 { get; set; }
}

我有一个带有 HTML 标记的 .aspx,用于包含复选框的表单:

<label for="MyCheckbox">Your choice</label>
<%= Html.CheckBoxFor(Model=>Model.Option1, new { id="Option1", @class="checkbox", onchange="return myValidation();", name="MyCheckbox", value="Option one" } ) %>

当它被编译时会产生这个 HTML:

<label for="MyCheckbox">Your choice</label>
<input class="checkbox" id="Option1" name="Option1" onchange="return myValidation();" type="checkbox" value="Option one" /><input name="Option1" type="hidden" value="false" />

每当我选中复选框并提交表单控制器操作时

class MyController : Controller {
   [AcceptVerbs(HttpVerbs.Post)]
   public ActionResult RequestStuff( ModelData data )
   {
   }
}

接收data,其中Option1false

我做错了什么?如何使复选框映射到模型成员?

【问题讨论】:

  • 我不太确定 Html.CheckBoxFor(Model=&gt;Model.Option1) 是否正确,可能 lambda 变量不应该命名为 Model,这是当前模型的别名,我不知道'不知道它是否会覆盖别名。 Html.CheckBoxFor(item =&gt; item.Option1) 看起来更好,虽然我不确定它是否是问题的根源。顺便说一句,视图生成的'Id'将对应您的属性名称,值将对应于值,因此您不必自己设置它。而“价值”很可能只能是真/假,而不是“我的价值”:)
  • 顺便说一句,我通常避免在使用帮助程序时添加自定义 HTML 选项,例如弄乱 DOM 元素的 ID 会破坏你的绑定。我添加的最多的是new { @class = "MyAwesomeStyle"}。其他所有内容(呈现的描述、值等)都是通过准备视图模型、注释等来处理的。
  • @相信我 - 我是一名医生:item 会是什么?
  • 一个 lambda 表达式变量,随意命名。本质上,它捕获传递给视图的模型,因此在编写 item =&gt; item. 之后,您将获得模型元素的 Intellisense :) Html 助手处理表达式,因此是 lambda 语句。
  • @相信我 - 我是一名医生:这种改变根本没有帮助。

标签: c# .net asp.net-mvc iis model


【解决方案1】:

既然你说在辅助表达式中更改别名并没有解决问题,我就花时间准备 MVC2 测试项目,如下所示:

MyModel.cs:

namespace TestAppMVC2.Models
{
    public class MyModel
    {
       public bool Option1 { get; set; }
    }
}

控制器的动作:

    public ActionResult MyAction()
    {
        var viewModel = new MyModel();
        return View(viewModel);
    }


    [HttpPost]
    public ActionResult MyAction(MyModel viewModel)
    {
        bool option = viewModel.Option1;
        return View();
    }

视图(MyAction.aspx):

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<TestAppMVC2.Models.MyModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
MyAction
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>MyAction</h2>

<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Fields</legend>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Option1) %>
        </div>
        <div class="editor-field">
            <%: Html.CheckBoxFor(model => model.Option1) %>
            <%: Html.ValidationMessageFor(model => model.Option1) %>
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>

看起来像这样:

勾选复选框后的结果:

顺便说一句,View 是通过 Add View -> MyModel 类和模板的强类型视图完全生成的(嗯,几乎完全是,我将 TextBoxFor 更改为 CheckBoxFor):Edit。

所以看起来上面的绑定应该没问题。试试这个,然后你可以在复选框上摆弄自定义选项。 :)

就像我写的in the other answer 一样,这个想法本质上是一样的,只是在 MVC3 中,Razor 语法看起来更简洁一些。但是,当涉及到差异时,就是这样。 :)

【讨论】:

  • 很好,问题恰好是value 复选框属性。我消除了它,现在映射工作。非常感谢。
  • 没问题,很高兴为您服务。祝您未来的网络应用努力好运。 :)
【解决方案2】:

在你的行中:

<%= Html.CheckBoxFor(Model=>Model.Option1, new { id="Option1", @class="checkbox", onchange="return myValidation();", name="MyCheckbox", value="Option one" } ) %>

Model 替换为另一个别名,即 m。所以它看起来像:

<%= Html.CheckBoxFor(m=>m.Option1, new { id="Option1", @class="checkbox", onchange="return      myValidation();", name="MyCheckbox", value="Option one" } ) %>

您直接引用了模型,其中 CheckBoxFor 采用了一个 HTML 帮助器实例。

我相信以下内容可能有助于您进一步理解:

MVC HTML Helpers and Lambda Expressions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多