2

我正在尝试实现这个答案的建议,但没有将显示名称存储在我的模型代码中,所以我相信这是一个单独的问题。

我有一个 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 )
   {
   }
}

接收datawhere Option1is false

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

4

2 回答 2

2

既然你说在帮助表达式中更改别名并没有削减它,我花时间准备 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>

看起来像这样:

基本动作

勾选复选框后的结果: 断点停止

顺便说一句,视图是由 MyModel 类和模板的 Add View -> Strongly Typed View 完全生成的(嗯,几乎完全,我改为):Edit TextBoxForCheckBoxFor

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

就像我在另一个答案中写的那样,这个想法本质上是一样的,只是在 MVC3 中,Razor 语法看起来更干净一些。但是,当涉及到差异时,就是这样。:)

于 2012-05-18T11:16:00.840 回答
0

在您的行中:

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

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

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

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

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

MVC HTML 助手和 Lambda 表达式

于 2012-05-18T11:33:09.477 回答