2016-04-26 6 views
2

私は、私のモデルのプロパティのすべてに異なる値を持つ4つのラジオボタンを持っています。ただし、フォームがサブミットすると、そのプロパティはnullを返します(他のすべては正しく戻ります)。コード:ラジオボタンのモデルバインディングは、そのプロパティ(ASP.NETコア)のnullを返します

1つを選択してフォームを送信し、Object.PropertyOneがnullを返します。しかし、手動でObject.PropertyOneをViewModelに設定すると、正しく表示されます。私は何が欠けていますか?

答えて

5

ラジオボタンに手動でnameを指定しないでください。 name="optradio"を削除すると、タグヘルパーが名前を発行することがわかります。独自の名前を指定すると、Model Binderはプロパティを正しく処理しません。

これは実際にはPropertyTwoの2つ目のプロパティを追加し、ソースコードを見てコントローラをデバッグすることで確認できます。あなたはPropertyTwoは、各ラジオボタンのObject_PropertyTwoの名前を持ち、かつ(Object.PropertyOneは依然としてバインドに失敗したのに対し、)それが正常に結合することがわかります:

モデル

public class MyObject 
    { 
     public string PropertyOne { get; set; } 
     public string PropertyTwo { get; set; } 
    } 

    public class MyModel 
    { 
     public MyObject Object { get; set; } 
    } 

コントローラ

public ActionResult Foo() 
    { 
    return View(new MyModel() { Object = new MyObject() }); 
    } 

    [HttpPost] 
    public ActionResult Foo(MyModel model) 
    { 
    return View(); 
    } 

@{ 
    ViewData["Title"] = "Test Page"; 
} 

@model MyModel 

<form asp-controller="Home" asp-action="Foo" method="post"> 
    <div id="RadioButtonGroup"> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyOne" value="A" type="radio" name="optradio" >Option One 
     </label> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyOne" value="B" type="radio" name="optradio" >Option Two 
     </label> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyOne" value="C" type="radio" name="optradio" >Option Three 
     </label> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyOne" value="D" type="radio" name="optradio" >Option Four 
     </label> 
    </div> 
    <div id="RadioButtonGroup"> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyTwo" value="A" type="radio">Option One 
     </label> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyTwo" value="B" type="radio">Option Two 
     </label> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyTwo" value="C" type="radio">Option Three 
     </label> 
     <label asp-for="Object.PropertyOne" class="radio-inline"> 
     <input asp-for="Object.PropertyTwo" value="D" type="radio">Option Four 
     </label> 
    </div> 
    <input type="submit" /> 
</form> 
+0

うわあ、詳細でよく説明された回答をいただきありがとうございます!私はカスタム名を削除することができたし、あなたが言ったように完璧に働いた。これらの小さなものは時には捉えにくく、見逃しやすいので、もう一度感謝します。私はそれを理解しようと多くの無駄な時間を費やしていたでしょう。 – Daath

+0

name属性は、name属性と同じ値を持つグループにすべてのラジオボタンをグループ化するために存在します。私がその名前を明示的に設定して、ラジオボタンがどのグループに属しているかを知っていなければ、asp.netコアはそれをどのように知っていますか? – Elisabeth

関連する問題