2016-09-29 1 views
1

私は4つの単純なラジオボタンを保持するエディタテンプレートDurationを持っています。
私のクラスTestのプロパティにこのテンプレートを使用しています。 このプロパティをラジオボタンリストにバインドして読み込み時に正しいラジオボタンを選択することができません。値を選択して送信すると、正しい値が返されます。 ラジオボタンの値をさまざまな値に変更しようとしましたが、役に立たないです。
これを機能させるには、どの値をRadioButtonForに渡す必要がありますか? 理想的には、このエディタテンプレートはnull可のfloatを取り込み、それでも動作します。浮動小数点値でMVC RadioButtonForを使用して正しいラジオボタンを選択するにはどうすればよいですか?

Duration.cshtml

@model float 
<h3>Model Value: @Model</h3> 
@Html.RadioButtonFor(model => model, 0.25F, new { id = "btnQuarterDay" }) @(.25F) 
@Html.RadioButtonFor(model => model, 0.5F, new { id = "btnHalfDay" }) @(.5F) 
@Html.RadioButtonFor(model => model, 0.75F, new { id = "btnThreeQuarterDay" }) @(.75F) 
@Html.RadioButtonFor(model => model, 1.0F, new { id = "btnOneDay" }) @(1.0F) 

Test.cs

public class Test 
{ 
    [UIHint("Duration")] 
    [Display(Name = "Days")] 
    public float Duration { get; set; } 
} 

にHomeController

public class HomeController : Controller 
{ 
    public ActionResult Index(float? duration = null) 
    { 
     var model = new Test 
     { 
      Duration = duration.GetValueOrDefault(1F) 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(Test model) 
    { 
     ViewBag.Success = true; 
     ViewBag.ValueSelected = model.Duration; 
     return View(model); 
    } 
} 

Index.cshtml

@model RadioButtonForTest.Models.Test 

@using (Html.BeginForm("Index", "Home", FormMethod.Post)) 
{ 
    <div class="row"> 
     <div class="col-md-4"> 
      @Html.EditorFor(model => model.Duration) 
      @Html.ValidationMessageFor(model => model.Duration) 
     </div> 
    </div> 

    <button type="submit" class="btn btn-primary">Submit</button> 
    if (ViewBag.Success ?? false) 
    { 
     <span>Value Selected:</span> @ViewBag.ValueSelected 
    } 
} 

UPDATE:プロット増粘剤
私は、クエリ文字列を経由して、それを渡すことができるように、期間中に取るようにindexアクションを有線。値がクエリ文字列を介して渡されない場合Duration.cshtmlModel.Equals(.50F)レポートTRUEをデバッグするとき、私は/Home/Index?duration=.5 何も選択されていないクエリ文字列に移動した場合

@Html.RadioButton("", Model, Model.Equals(1.0F), new { id = "radbtnOneDay4" }) 

、しかし:それは以下のラジオボタンを選択します。だから私はこのラジオボタンが選択されると期待しています:

@Html.RadioButton("", Model, Model.Equals(.50F), new { id = "radbtnHalfDay4" }) 

これはクレイジーではありませんか?なぜこのラジオボタンをチェックしていないのですか?これはバグですか?浮動小数点数を扱うために追加できるカスタムモデルバインダーはありますか?

UPDATE 2
クエリ文字列パラメータdurationは、モデル名と一致し、クエリ文字列は、モデルの値をオーバーライドしています。
パラメータをdurに変更したところ、正常に動作しました。次のURLを使用すると、ViewModelの値が使​​用されます。 /Home/Index?dur=.5
これの背後には確固たる理由があることはわかっていますが、これは怒っています。

+0

わかりませんメインビューで直接表示 –

+0

プロットが太くなっている:モデルヘルパーがHTMLのヘルパーがモデル値に使用するものと、デバッガが表示するものが異なることがあります。詳細については、http://stackoverflow.com/questions/1775170/asp-net-mvc-modelstate-clearを参照してください。 – Pitchmatt

答えて

0

RadioButtonForヘルパーはテンプレート内では機能しません(編集:...あなたがモデル=>モデル式のように単純なメンバー値にバインドする場合は、モデル式は空の名前になります)。あなたは

@Html.RadioButton("", 0.25F, Model == 0.25F, new { id = "btnQuarterDay" }) @(.25F) 
@Html.RadioButton("", 0.5F, Model == 0.5F, new { id = "btnHalfDay" }) @(.5F) 
@Html.RadioButton("", 0.75F, Model == 0.75F, new { id = "btnThreeQuarterDay" }) @(.75F) 
@Html.RadioButton("", 1.0F, Model == 1.0F, new { id = "btnOneDay" }) @(1.0F) 

編集#2にテンプレートコードを変更する必要があります。

public class DurationContainer { 
    public float Duration { get; set; } 
} 

public class Test2 { 

    [UIHint("Duration2")] 
    public DurationContainer Container { get; set; } 
} 

Index.cshtml:

@Html.EditorFor(model => model.Container) 

し、別の選択肢は、より複雑なモデルを用いることであろうDuration2.cshtmlテンプレートとして:

@Html.RadioButtonFor(model => model.Duration, 0.25F, new { id = "btnQuarterDay" }) @(.25F) 
@Html.RadioButtonFor(model => model.Duration, 0.5F, new { id = "btnHalfDay" }) @(.5F) 
@Html.RadioButtonFor(model => model.Duration, 0.75F, new { id = "btnThreeQuarterDay" }) @(.75F) 
@Html.RadioButtonFor(model => model.Duration, 1.0F, new { id = "btnOneDay" }) @(1.0F) 
+0

実際、 'RadioButtonFor'はテンプレートで完璧に機能します。 'model => model'式に起因する問題 - これは有効ではありません。 –

+0

@AlexArt。私は敬意をこめて、この1時間で時間を燃やした後、ただ単に同意しなければなりません。 – Airn5475

+0

@Pitchmattご回答いただきありがとうございます。上記の私の更新を参照してください。私は 'Model.Equals'を使用しており、運がないとしています。それでも、デバッガはそれを選択する必要があると言います。私はポストする権利のある価値を得ることさえできません。 – Airn5475

0

最初の引数がモデルプロパティのメンバー式であり、モデル自体ではないので、model => modelが間違っているため、エディタテンプレートが機能していません。 `Html.RadioButtonFor 'の代わりにHtml.RadioButtonを使って簡単に修正できます。プロパティ名を指定する代わりに、単に空の文字列を渡すだけであることに注意してください。その理由は、EditorTemplatesが、プリペイドモデルをパラレルモデルとして追加することによって正しいプロパティ名を生成していることです。だからあなたのテンプレートはそのようになります。なぜそれはあなたのEditorTemplateでは動作しませんが、あなたは `@ Html.RadioButtonFor(M => m.Duration、0.25F)`などが含まれている場合、それは動作します

@model float 
<h3>Model Value: @Model</h3> 
@Html.RadioButton("", 0.25F, new { id = "btnQuarterDay" }) @(.25F) 
@Html.RadioButton("", 0.5F, new { id = "btnHalfDay" }) @(.5F) 
@Html.RadioButton("", 0.75F, new { id = "btnThreeQuarterDay" }) @(.75F) 
@Html.RadioButton("", 1.0F, new { id = "btnOneDay" }) @(1.0F) 
+0

あなたの応答をありがとう。残念ながら、これは私のために働いていませんモデルに対応するラジオボタンが選択されていません。1つを選択して送信すると、正しい値が返されます。 – Airn5475

関連する問題