23

MVC ビューにドロップダウン リストがあります。ドロップダウン リストの選択変更時に、コントローラーで特定のアクション メソッドを呼び出したい。

私がビューで行ったことはこれです:

<%=Html.DropDownList("ddl", ViewData["AvailableList"] as SelectList,
  new { onchange = "this.form.action='MyMethod';this.form.submit();" })%>

すべてがコンパイルされています。しかし、ドロップダウンの選択を変更すると、実行時例外がスローされます。

「Microsift JScript ランタイム エラー: オブジェクトはプロパティまたはメソッドをサポートしていません」

リスト選択変更イベントで特定のアクションにリダイレクトするにはどうすればよいですか?
このアクション メソッドにパラメーターを渡すにはどうすればよいですか?

4

7 に答える 7

23

本当にフォームを送信する必要がありますか? リダイレクトできます:

onchange = "redirect(this.value)"

redirectカスタム定義関数です:

function redirect(dropDownValue) {
    window.location.href = '/myController/myAction/' + dropDownValue;
}
于 2010-02-06T12:38:13.330 に答える
14

あなたのアプローチはうまくいくはずです。発生している問題はthisonchangeイベントでの使用が無効であるということです。this.form参照を次のようなものに置き換えてみてください。

<%= Html.DropDownList(
        "ddl", ViewData["AvailableList"] as SelectList, 
        new { onchange = @"
            var form = document.forms[0]; 
            form.action='MyMethod';
            form.submit();" 
        } ) %>
于 2010-02-06T21:44:54.787 に答える
6

これはjQueryのことです。それにクラスを与えて、それに接続します。

Html.DropDownList("ddl", AvailableList, new { @class = "_select_change" })

大まかなスクリプトは次のようになります。

$('._select_change').change(function() { $.post(ctrlUrl); })
于 2010-02-06T12:40:06.070 に答える
2

コントローラのアクションから、同じ方法で呼び出しを行います。

<%= Html.DropDownList(ddl, ViewData["items"] as SelectList, new { onchange = string.format("doSomething({0}); return false;", action) }) %>

これを行ったら、メソッドを呼び出すJavascript関数をページに配置します。ただし、どのように呼び出すかは、AJAX呼び出しであるかどうかによって異なります。つまり、ページを往復するかどうかです。非AJAX呼び出しの場合:

function doSomething(action) {
    window.location.href = action;
}

AJAX呼び出しの場合:

function doSomething(action) {
    $.load(action);
}

アクションにパラメーターを渡すには、渡すデータ要素がすべて<form>タグ内に含まれていることを確認する必要があります。たとえば、ドロップダウンリストに名前と名前を含めたいとします。ビューでは、次のようなことを行います。

<%= using (Html.BeginForm()) 
   { %>
    <table>
        <tr>
            <td>First Name:</td>
            <td><%= Html.TextBox("FirstName") %></td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td><%= Html.TextBox("LastName") %></td>
        </tr>
        <tr>
            <td>Assign to:</td>
            <td><%= Html.DropDownList(ddl, ViewData["items"] as SelectList, 
                new { onchange = string.format("doSomething({0}); return false;", ViewData["action"]) }) %></td>
        <tr>
    </table>
<% } %>

Javascript関数の場合:

function doSomething(action) {
    var firstName = $('#FirstName').val();
    var lastName = $('#LastName').val();
    $.load(action, { first: firstName, last: lastName });
}
于 2010-02-06T20:55:10.107 に答える
2

両方好き : D

私はミックスを提案します - 私は jQuery が大好きです。

$('ddl').change(
 function() {
  // This contains your selected option val
  $(this).val();

// so you can do domething like...
  $.post(
    $(this).val(),
    { Param1: xxxx,
      Param2: xxxx,
      Param3: xxxx },
    function(data) {
     // handle your call here. 'data' contains the response
    } );
}
于 2010-02-06T19:51:54.970 に答える
1

@Shimmy jsで関数を定義せずに、ワンライナーでこれを行う方法はありますか?

はい、できます。そのためのコードは次のとおりです。

@Html.DropDownListFor(m => m.Name, new SelectList((System.Collections.IEnumerable)ViewBag.DropDownName, "Value", "Text"), new { @class = "form-control", onchange = "document.location.href = '/Home/Employee?c=' + this.options[this.selectedIndex].value;" })
于 2015-07-08T12:45:32.083 に答える