0

編集:私の質問の下部を読んで、私が実際に何をしたかを確認してください。私のソリューションにはAngularJSが必要なため、別の回答を受け入れました。


私はC#4.0とMVC 3/Razorを使用しています。独自のヘルパークラスを作成するよりも、フレームワークの既存の機能を活用したいと思います。これが私がやっていることです、簡略化されています:

これが私のモデルです:

MyModel.cs

public class MyModel
{
    public string Name { get; set; }
    public int ID { get; set; }
}

そして、これまでの私の見解:

Index.cshtml

@model IEnumerable<MyModel>

Please select a Model.

<select name="id">
    @foreach (var m in Model)
    {
        <option value="@(m.ID)">@(m.ID) - @(m.Name)</option>
    }
</select>

そして私のコントローラー:

MyController.cs

public class MyController : Controller
{
    public ActionResult Index() { /* ... */ }
    public ActionResult Display(int id) { /* ... */ }
    public ActionResult Delete(int id) { /* ... */ }
    public ActionResult Edit(int id) { /* ... */ }
}

私の見解では、3つの送信ボタンが必要です。それぞれが異なるコントローラー/アクションにリンクしており、1つは編集、削除、表示用です。ただし、ユーザーが選択したIDを(GET経由で)渡すようにしたいと思います。どうすればよいですか?

タイプ要素valueのに基づいて、3つのうちどれを選択するかを決定することを唯一の目的とする新しいコントローラーアクションを作成できることは知っていますが、そのアプローチは私には醜いようです。そのステップをバイパスしたいと思います。理想的には、次のようなものが必要です。submitinput

@using (Html.BeginForm("", "", FormMethod.Get))
{
    <select name="id">
        @foreach (var m in Model)
        {
            <option value="@(m.ID)">@(m.ID) - @(m.Name)</option>
        }
    </select>

    @Html.SubmitButton("Edit", "My")
    @Html.SubmitButton("Delete", "My")
    @Html.SubmitButton("Display", "My")
}

しかし、そのようなことをしているように見えるメソッドシグネチャは見つかりませんHtml


編集:

これが私がやったことです。AngularJSと呼ばれるJavaScriptライブラリを使用しますが、追加のJavaScript配管は必要ありません。それはうまくいきます。

@model IEnumerable<MyModel>
<html>
    <head>
        <script type="text/javascript" src="../../Scripts/angular.js"></script>
    </head>
    <body ng-app>
        <select ng-model="ID">
            @foreach (var m in Model)
            {
                <option value="@(m.ID)">@(m.ID) - @(m.Name)</option>
            }
        </select>

        @{
            var forms = new[] 
            {
                new { ActionName = "Display", ControllerName = "My" },
                new { ActionName = "Edit", ControllerName = "My" },
                new { ActionName = "Delete", ControllerName = "My" }
            };

            foreach (var form in forms)
            {
                using (Html.BeginForm(form.ActionName, form.ControllerName, FormMethod.Get))
                {
                    <input type="submit" value="@(form.ActionName)" ng-disabled="ID == null"/>
                    <input type="hidden" name="id" value="{{ID}}"/>
                }
            }
        }

    </body>
</html>
4

2 に答える 2

2

属性を使用してこれを行うことができます(私は持っています)。テーマのいくつかの異なるバリエーションを試した後、私はこれで解決しました:

http://blog.ashmind.com/2010/03/15/multiple-submit-buttons-with-asp-net-mvc-final-solution/

基本的に、送信の名前に基づいてルーティングします。あなたの場合:

 <input type="submit" name="delete" value="Delete" />
 <input type="submit" name="Edit" value="Edit" />

とコントローラー

public class MyController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id) {
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Delete(int id) {

    }
}

属性

  public class HttpParamActionAttribute : ActionNameSelectorAttribute {
        public override bool IsValidName(ControllerContext controllerContext,  
                                       string actionName, MethodInfo methodInfo) 


 {

            if (actionName.Equals(methodInfo.Name,  
                                  StringComparison.InvariantCultureIgnoreCase))
                return true;

            if (!actionName.Equals("Action", 
                                   StringComparison.InvariantCultureIgnoreCase))
                return false;

            var request = controllerContext.RequestContext.HttpContext.Request;
            return request[methodInfo.Name] != null;
        }
    }
于 2012-09-25T19:20:35.767 に答える
1

EditおよびについてDisplayは、明らかに、フォームを送信する必要はありません。そのためにGETを使用できます。したがって、Html.ActionLinkヘルパーメソッドを使用して、ユーザーが画面を承認するためのリンク(アクションメソッド)を表示できます。

リンクのドロップダウンから選択したアイテムの値を渡すには、クリックイベントのJavaスクリプトで選択した値を取得し、それをアクションメソッドに送信します。

@Html.ActionLink("Edit","Edit","YourController",null ,new {@class="lnk"})
@Html.ActionLink("Display","Display","YourController",null ,new {@class="lnk"})
@Html.ActionLink("Delete","Delete","YourController",null ,new {@class="lnk"})

これらのリンクのクリックイベントをキャプチャするJavaScript

$(function(){
  $("a.lnk").click(function(e){
     e.preventDefault();
     var targetUrl=$(this).attr("href");
     var selectedVal=$("#YourDropdownID").val();
     targetUrl=targetUrl+"?id="+selectedVal;
     window.location.href=url;
  });
});

削除の場合、ユーザーを確認画面に移動するリンクを表示し、そこにHTTPPOST送信を行う送信ボタンを設定できます。

CSSをカスタマイズして、aタグを送信ボタンのように見せることができます

また、ビューのforeachループを使用してドロップダウンをレンダリングしないでください。MVCでそれを行うためのHTMLヘルパーメソッドはすでにあります。あなたは常にそれを利用するべきです。これがその方法を説明する答えです

于 2012-09-25T18:42:57.497 に答える