4

以下のような ViewModel があります。

public class CheckoutViewModel
{
    public string ProductNumber { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public Input UserInput;

    public class Input
    {
        public string Email { get; set; }
        public string Phone { get; set; }
    }
}

そして、次のようなアクション:

[HttpPost]
public ActionResult Index(CheckoutViewModel model)
{
    // ...
    return View();
}

そして、私のモデルは以下のようにバインドされています:

@model GameUp.WebUI.ViewModels.CheckoutViewModel

@using (Html.BeginForm("Index", "Checkout", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    <!-- some HTML -->

    @Html.LabelFor(m => m.UserInput.Email)
    @Html.TextBoxFor(m => m.UserInput.Email)

    @Html.LabelFor(model => model.UserInput.Phone)
    @Html.TextBoxFor(model => model.UserInput.Phone)

    <button>Submit</button>
}

フォームを送信すると、UserInput が null になります。ASP.NET MVC がネストされた型をバインドできることは知っていますが、このコードではバインドできません。また、次の方法でメールと電話の値を取得できます。

var email = Request.Form["UserInput.Email"];
var phone = Request.Form["UserInput.Phone"];

多分私は何か間違ったことをします!これは、Web のどこにでもあるシンプルなモデル バインディングです。

4

1 に答える 1

10

にセッターを入れるのを忘れましたUserInput。セッターは自動ではないと思います。とにかく、getter/setter を設定するだけで動作させることができUserInput、コントローラ メソッドで追加の操作を行う必要はありません。

public Input UserInput { get; set; }

完全なモデル:

public class CheckoutViewModel
{
    public string ProductNumber { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
    public Input UserInput { get; set; }

    public class Input
    {
        public string Email { get; set; }
        public string Phone { get; set; }
    }
}
于 2013-04-03T05:39:29.420 に答える