c# - 为什么我的复选框没有映射到 MVC 模型成员?

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

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

我有一个 MVC View

<%@ 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" />

每当我选中复选框并提交表单时, Controller 操作

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

接收数据,其中Option1false

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

最佳答案

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

MyModel.cs:

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

Controller 的操作:

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


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

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>

看起来像这样:

Basic action

选中复选框后的结果: Breakpoint stop

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

所以看起来上面的绑定(bind)应该没问题。尝试一下,然后您就可以在复选框上摆弄自定义选项。 :)

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

关于c# - 为什么我的复选框没有映射到 MVC 模型成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10651030/

相关文章:

c# - BitmapSource.CopyPixel : how to copy only area of interest?

c# - 获取从不同程序集执行的打开窗口窗体实例的列表

c# - 在 Html.ActionLink 中包含所有查询字符串参数

c# - 在 .NET 4.8 上的 ASP.NET MVC Web 应用程序中安装 Bootstrap 5

c# - 关闭表单的简便方法

.net - 将自定义 .NET 代码与 DOTNETNUKE 一起使用

c# - 查明 IEnumerable<> 是否具有唯一值的最佳方法

c# - 控件的事件到外部静态类方法

使用自定义 Facebook 和 Google 按钮进行 ASP.NET Identity 登录

asp.net-mvc - Azure Web 角色启动时 Application_Start 循环