1

各行にデータベースのステータス ビットを切り替えるボタンがある HTML テーブルがあります。Javascriptがオプションではないと仮定すると、これを処理する「ベストプラクティス」の方法は何ですか?

現在、各行を次のような形式でラップして処理しています。

<table>
    <tr>
        <td>
            <form action="/FooArea/BarController/BazAction" id="frm0" name="frm0" method="post">
                 <span>Item 1</span>
                 <input type="submit" value="Toggle1" name="submitButton"  />
                 <input type="submit" value="Toggle2" name="submitButton"  />
                 <input type="hidden" name="itemID" value="1" />
            </form>
        </td>
    </tr>
    <tr>
        <td>
            <form action="/FooArea/BarController/BazAction" id="frm1" name="frm1" method="post">
                 <span>Item 2</span>
                 <input type="submit" value="Toggle1" name="submitButton"  />
                 <input type="submit" value="Toggle2" name="submitButton"  />
                 <input type="hidden" name="itemID" value="2" />
            </form>
        </td>
    </tr>
</table>

post メソッドは次のようになります。

string buttonName = Request.Form["submitButton"];    
if (!String.IsNullOrEmpty(buttonName )) 
{
     int itemID = Convert.ToInt32(Request.Form["itemID"]);
     switch (buttonName )
     {
         case "Toggle1":
         DoSomething(itemID);
         break;

         case "Toggle2":
         DoSomethingElse(itemID);
         break;
     }
}

より良い提案はありますか?1 ページに 50 個のフォームがあるのはクールですか? この場合、あなたが何をしているのか教えてください。

4

4 に答える 4

2

JavaScript を使用せずに POST シナリオを処理する最善の方法は、他の何人かが述べているように、必要な値のみと送信ボタンが 1 つだけの小さなフォームです。基本的には、隠しフィールドに必要な POST 値と送信ボタンを含むフォームを作成するヘルパー メソッドを作成する必要があります。たとえば、次のようなメソッドを使用できます。

<%= Html.PostLink("FooArea/BarController/BazAction", "Toggle1", new List<KeyValuePair<string, string>>{ new KeyValuePair<string, string>("itemId", 1), new KeyValuePair("action", "option1") }); %>

かなり冗長に見えますが、できるだけ一般的なものにしようとしました。ビューをレンダリングするときにコントローラーでおそらく作成できるため、List<KeyValuePair<string, string>>何かを呼び出すだけで済みます

 <%= Html.PostLink("FooArea/BarController/BazAction", "Toggle1", Model.Values) %>

投稿を処理するアクション メソッドでは、投稿された FormCollection にバインドし、値を確認する代わりにitemIdとの値を取得actionして、何をすべきかを決定しRequest.Formます。

ヘルパー メソッドの実装は次のようになります。

public static string PostLink(this HtmlHelper helper, string postAction, string submitText, IEnumerable<KeyValuePair<string, string>> postValues)
{
    var form = new TagBuilder("form");

    // Setup basic properties like method, action
    form.Attributes.Add("method", "post");
    form.Attributes.Add("action", postAction);

    // Instantiate a stringbuilder for the inner html of the form
    var innerHtml = new StringBuilder();

    // Create and append hidden fields for the post values
    foreach(var value in postValues)
    {
        var hidden = new TagBuilder("input");
        hidden.Attributes.Add("type", "hidden");
        hidden.Attributes.Add("name", value.Key);
        hidden.Attributes.Add("value", value.Value);
        innerHtml.Append(hidden.ToString(TagRenderMode.SelfClosing));
    }

    // Create the submit button
    var submit = new TagBuilder("input");
    submit.Attributes.Add("type", "submit");
    submit.Attributes.Add("value", submitText);
    // Append it to the stringbuilder
    innerHtml.Append(submit.ToString(TagRenderMode.SelfClosing));

    // Set the InnerHtml property of the form, and return it
    form.InnerHtml = innerHtml.ToString();
    return form.ToString(TagRenderMode.Normal);
}
于 2010-02-02T16:31:32.943 に答える
0

技術的にはこれが最善の方法だと思います。ユーザビリティの観点から、これが最善の方法であるかどうか疑問に思うかもしれません。リスト内の項目が 20 を超えると、かなり混乱する可能性があります。しかしもちろん、私はあなたが何をプログラミングしているのか本当に知りません:)

アクティブ化ボタンと非アクティブ化ボタンに異なるアクションを作成することについて、Mattias に同意します。これにより、switch ステートメントを使用する必要がなくなります。

于 2010-02-02T16:05:51.477 に答える
0

これは、一部の JQuery および Ajax 機能の主なケースのようです。しかし、javascript がオプションでない場合は、それぞれをフォームにラップすることがおそらく最も簡単な解決策だと思います。

于 2010-02-02T15:50:09.900 に答える
0

私がこのようなことをする必要があるとき、私はあなたがここで行うのとほぼ同じ方法でそれを行います. 1 つのビューに複数のフォームを表示しても問題ありません。1 つのビューに複数のリンクがあるようなものです (ただし、GET ではなく POST を使用します)。Webフォームにはフォームタグが1つしかないため、多くの.net開発者はそれが間違っていると考えていると思います. あなたの場合、送信ボタンごとに異なることをしているように見えるので、さらにフォームを作成します。コントローラーのボタンの名前を確認する必要があるのはコードの匂いだと思います。それらがアクティブ化/非アクティブ化のようなことをする場合、おそらくそれをboolまたは何かとして投稿し、両方のフォームを同じアクションに投稿する必要があります。

于 2010-02-02T15:55:21.530 に答える