web-dev-qa-db-ja.com

ASP.NET MVC:非htmlヘルパー要素を「モデルバインド」する方法

modelプロパティをhtmlヘルパーを使用せずに作成されたhtml要素にバインドする方法を教えてください。

言い換えれば、次のような単純なhtml要素に:<input type="text" />

13
dan

Model Binding を参照している場合、ヘルパーは必要ありませんが、命名規則が必要です。ヘルパーは、HTMLマークアップを簡単かつ簡潔に作成できるようにします。

プレーンなHTML入力を作成し、name属性を正しく設定することができます。デフォルトの命名規則はドットベースであり、親レベルのエンティティの名前は省略されていますが、そこから修飾されています。

このコントローラーについて考えてみましょう。

public class MyControllerController : Controller
{
     public ActionResult Submit()
     {
         return View(new MyViewModel());
     }

     [HttpPost]
     public ActionResult Submit(MyViewModel model)
     {
            // model should be not null, with properties properly initialized from form values
            return View(model);
     }
}

そしてこのモデル:

public class MyNestedViewModel
{
    public string AnotherProperty { get; set; }
}

public class MyViewModel
{
    public MyViewModel()
    {
         Nested = new MyNestedViewModel();
    }

    public string SomeProperty { get; set; }

    public MyNestedViewModel Nested  { get; set; }
}

次のフォームを純粋にHTMLで作成できます。

<form method="POST" action="MyController/Submit">
    <div><label>Some property</label><input type="text" name="SomeProperty" /></div>
    <div><label>Another property</label><input type="text" name="Nested.AnotherProperty" /></div>
    <button type="submit">Submit</button>
</form>

投稿された値を(2番目のSubmitオーバーロードで)表示する場合は、HTMLを変更してモデルのプロパティをレンダリングする必要があります。これをビューに配置します。この場合はRazor構文を使用し、Submit.cshtml

@model MyViewModel
<form method="POST" action="MyController/Submit">
    <div><label>Some property</label><input type="text" name="SomeProperty" value="@Model.SomeProperty" /></div>
    <div><label>Another property</label><input type="text" name="Nested.AnotherProperty" value="@Model.Nested.SomeProperty" /></div>
    <button type="submit">Submit</button>
</form>

したがって、これはヘルパーなしで実行できますが、可能な限りヘルパーを使用する必要があります。

31
moribvndvs

名前を付けるだけです。

<input type="text" name="foo" />

次に、コントローラーアクション内に、同じ名前の引数を設定します。

public ActionResult Process(string foo)
{
    // The foo argument will contain the value entered in the 
    // corresponding input field
}
7
Darin Dimitrov