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 )
   {
   }
}

受け取りdata場所Option1はどこか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>

次のようになります。

基本動作

そして、チェックボックスをチェックした後の結果: ブレークポイント停止

ちなみに、View はMyModel クラスとテンプレートの Add View -> Strongly Typed View: Editによって完全に生成されました (ほぼ完全に、私は に変更TextBoxForしました)。CheckBoxFor

したがって、上記のバインディングは問題ないようです。これを試してみると、チェックボックスのカスタム オプションをいじることができます。:)

他の回答で書いたように、考え方は本質的に同じですが、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 ヘルパーとラムダ式

于 2012-05-18T11:33:09.477 に答える