13

新しいプロジェクトで asp.net mvc を試していますが、奇妙なことに遭遇しました。テキスト ボックスに MVC UI ヘルパーを使用すると、呼び出し間で値が保持されます。しかし、一連のラジオ ボタンを使用すると、チェック状態が保持されません。

これが私の見解からの例です。

<li>
        <%=Html.RadioButton("providerType","1")%><label>Hospital</label>
        <%=Html.RadioButton("providerType","2")%><label>Facility</label>
        <%=Html.RadioButton("providerType","3")%><label>Physician</label>
</li>

フォームがポストバックされたら、「ProviderType」をプロパティの 1 つとしてオブジェクトを作成します。オブジェクトの値が設定され、プロバイダーを引数として RedirectToAction を実行します。すべて問題なく、「 http://localhost/Provider/List?ProviderType=1 」のような URL になり、ProviderType が表示されます。値は URL に永続化されますが、UI ヘルパーはチェックされた状態を取得していません。

リストボックス、ドロップダウンリスト、およびラジオボタンでこの問題が発生しています。テキストボックスは問題なく値を取得します。私が間違っていることがわかりますか?私はヘルパーがこれをやってくれると思っていますが、おそらく私は自分でこれを処理する必要があります. 私はこれを通して自分のやり方を感じているので、あなたの意見をお待ちしております.

編集:選択した値を取る SelectList コンストラクターのオーバーライドを見つけました。これで、上記のドロップダウンの問題が解決されました。

編集#2:うまくいくものを見つけましたが、このようにするのは苦痛です。これは推理すべきだと思います。

<li>
  <%=Html.RadioButton("ProviderType","1",Request["ProviderType"]=="1")%><label>Hospital</label>
  <%=Html.RadioButton("ProviderType", "2", Request["ProviderType"] == "2")%><label>Facility</label>
  <%=Html.RadioButton("ProviderType", "3", Request["ProviderType"] == "3")%><label>Physician</label>
</li>

うまくいけば、誰かが別の方法を考え出すでしょう。

4

7 に答える 7

7

ラジオ ボタンにモデルのプロパティと同じ名前を付けると、MVC は自動的に該当するボタンに checked 属性を設定します。

これは、強く型付けされたモデルを持つことに依存していると思います。

于 2009-08-04T05:47:10.940 に答える
4

あなたが必要とするのは、あなたの見解では次のようなものです:

<% foreach(var provider in (IEnumerable<Provider>)ViewData["Providers"]) { %>
    <%=Html.RadioButton("ProviderType", provider.ID.ToString(), provider.IsSelected)%><label><%=provider.Name%></label>
<% } %>

そして、コントローラーにこれがあります:

var providers = GetProviders();
int selectedId = (int) Request["ProviderType"]; // TODO: Use Int32.TryParse() instead
foreach(var p in providers)
{
    if (p.ID == selectedId)
    {
        p.IsSelected = true;
        break;
    }
}
ViewData["Providers"] = providers;
return View();

Provider クラスは次のようになります。

public class Provider
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}
于 2009-03-08T03:40:21.360 に答える
2

現在vs2010を使用していますが、次のように機能します。

<%=Html.RadioButton("ProviderType","1",Model.ProviderType==1)%><label>Hospital</label> 

良く見える?

于 2010-06-07T12:31:54.770 に答える
2

フォームを method="POST" として指定するのを忘れない限り、フォームはクエリ文字列に投稿されるべきではありません。フォームはどのように指定していますか?ASP.NET MVC ベータ版を使用していますか?

于 2008-11-04T23:22:41.000 に答える
1

この HTML ヘルパー拡張機能を作成しました。

    <Extension()> _
    Public Function RadioButtonList(ByVal helper As HtmlHelper, ByVal name As String, ByVal Items As IEnumerable(Of String)) As String
        Dim selectList = New SelectList(Items)
        Return helper.RadioButtonList(name, selectList)
    End Function

    <Extension()> _
    Public Function RadioButtonList(ByVal helper As HtmlHelper, ByVal Name As String, ByVal Items As IEnumerable(Of SelectListItem)) As String
        Dim sb As New StringBuilder
        sb.Append("<table class=""radiobuttonlist"">")
        For Each item In Items
            sb.AppendFormat("<tr><td><input id=""{0}_{1}"" name=""{0}"" type=""radio"" value=""{1}"" {2} /><label for=""{0}_{1}"" id=""{0}_{1}_Label"">{3}</label></td><tr>", Name, item.Value, If(item.Selected, "selected", ""), item.Text)
        Next
        sb.Append("</table>")
        Return sb.ToString()
    End Function

次に、ビューで:

<%= Html.RadioButtonList("ProviderType", Model.ProviderTypeSelectList) %>

コントローラーでは、オプションは標準を使用して自動的にマップされます。

UpdateModel(Provider)

魅力のように機能します。テーブルフォビアの場合は、生成されたマークアップを変更してください。

于 2011-01-12T17:57:16.310 に答える
1

論理的には持続しません。セッション状態はありません。まったく新しいページと考えてください。ラジオ ボタンに値を設定するには、ViewData["ProviderType"] = 3 のようなものを保持して、ラジオ ボタンにそのデータを再設定する必要があります。

于 2009-02-12T20:05:24.370 に答える
-1

意見:

<%=Html.RadioButton("providerType","1")%><label>Hospital</label>
<%=Html.RadioButton("providerType","2")%><label>Facility</label>
<%=Html.RadioButton("providerType","3")%><label>Physician</label>

コントローラ:

public ActionResult GetType(FormCollection collection)
{
 string type=collection.Get("providerType");

  if(type=="1")
   //code
  else if(type=="2")
   //code
  else
   //code

 return View();
}
于 2010-12-11T09:54:19.203 に答える