2011-11-12 8 views
5

ASP.NET MVC 2はレコードを削除するリンク(つまり<a>)をレンダリングします。MVCの作成Deleteボタンの拡張 - MVCのHtmlヘルパーを拡張するには?

GETアクションによる削除アクションを許可することは有害な場合があります。そのため、POSTを発行して削除を実行します。

私は次のコードを作成しました:今

<% using (Html.BeginForm("Delete", "Boodschap", new { id = item.BoodschapID })) 
    { %> 
    <button>Delete</button> 
<% } %> 

私は拡張メソッドとしてHTMLヘルパーにこのコードを追加したい:今ここに

public static MvcForm DeleteButton(this HtmlHelper helper, string name, 
    string actionName, string controllerName, string routeValues) 
{ 
    MvcForm form = helper.BeginForm(actionName, controllerName, routeValues); 
    return form; 
} 

はどこであるI捕まってしまった。この削除ボタンを機能させるにはどうすればよいですか?

答えて

4

フルコードを生成する場合は、MvcFormを返すのは間違いでしょう。 MvcHtmlStringを返し、そのメソッド内でHTMLを構築する必要があります。

@Html.DeleteButton("Delete", "Boodschap", new { id = item.BoodschapID }); 

直接HTMLを生成:あなたのようにそれを使用することができますその方法(注:テストされていない、あなたは、などを、適切なヌルチェックを必要とするかもしれないが)

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, 
    string actionName, object htmlAttributes) 
{ 
    return DeleteButton(helper, name, actionName, null, null, htmlAttributes); 
} 

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, 
    string actionName, string controllerName, object routeValues, 
    object htmlAttributes) 
{ 
    var buttonBuilder = new TagBuilder("button"); 
    buttonBuilder.SetInnerText(name); 

    var formBuilder = new TagBuilder("form"); 
    var urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 
    formBuilder.Attributes.Add("action", urlHelper.Action( 
     actionName, controllerName, routeValues)) 
    formBuilder.Attributes.Add("method", FormMethod.Post); 
    formBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
    formBuilder.InnerHtml = buttonBuilder.ToString(); 

    return new MvcHtmlString(formBuilder.ToString()); 
} 

代替は、フォームヘルパーを再利用することであろう私は<form>要素は、トリックを行うだろうと思いますが、それは非常にAJAX-yのではない、

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, string actionName, object routeValues) 
{ 
    return DeleteButton(helper, name, actionName, null, routeValues, null); 
} 

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, string actionName, string controllerName, object routeValues, object htmlAttributes) 
{ 
    using (helper.BeginForm(actionName, controllerName, routeValues, FormMethod.Post, htmlAttributes)) 
    { 
     var response = helper.ViewContext.HttpContext.Response; 
     var builder = new TagBuilder("button"); 
     builder.SetInnerText(name); 
     response.Write(builder.ToString(TagRenderMode.Normal)); 
    } 
    return MvcHtmlString.Create(""); 
} 
+0

は私が最後の答えを編集しました。 –

+0

HtmlHelperで 'response.Write'をどうやって行うのか、とても良い見通しです。ありがとう!!私は再びそれを投票することを願っています。 –

1

:とのResponse.Writeは、しかし、持っている方法は、おそらく何かのように、(空の)文字列を返します。

むしろ、なぜ適切な<a>リンクについてjQuerywire up to the click eventを使用して、issue an HTTP POST to the server yourselfありませんか?これに

$document.ready(function() { 
    // "deleteLink is a class that identifies links that 
    // are used for deleting, you might have some other mechanism 
    $("a .deleteLink").click(function() { 
     $.post('post url', function(data) { 
      // Do something with the data returned 
     });  
    }); 
}); 

利点あなたは、あなたが削除したいすべての項目について<form>を挿入し、意味的関連、クリーンなマークアップは常に開発からプラスの場合よりもクリーンあなたのHTML SEOをずっとを維持していますその他の視点。いくつかの変更後 - - 正常に動作するようです

+0

私はある種のAjax投稿を使う考えが好きです。よりクリーンなHTMLの議論は私の頭の中にあります。それがビジネスアプリの目標かどうかは分かりません。私はhttp://www.hanselman.com/blog/JavaScriptIsAssemblyLanguageForTheWebSematicMarkupIsDeadCleanVsMachinecodedHTML.aspxを読んで以来、私は思ってきたビジネスアプリケーションでもきれいなHTMLを書くために参加すべきです。 –

+0

@ KeesC.Bakker:それは目標だとは言っていませんが、クリーンなHTMLは良い開発慣行の目標です。 HTMLの壁に直面したとき、何かが間違っていた場所を見るためにすべてを歩き回る悪夢になるだろう。 jQuery(または類似のもの)を使用すると、より良い分離が得られます。さらに、あなたはバトルテスト済みのコードを使用しています。最後に、あなたはdigressedので、ニッチなケースを自分で把握しようとは対照的に、あなたはすべて同じパラダイムに従っていたときに役立つことができます野生のより多くの人々を持っています。 – casperOne

+0

私はAJAX経由で処理することに賛成ですが、ページにJavaScriptエラーがあるかJavaScriptがオフになっているとこれが壊れます。あなたは、フォームをハンドラで傍受し、AJAX経由でそれを行うことができます。あるいは、必要に応じて適切なハンドラでボタンだけを残してフォームをアンラップすることもできます。 – tvanfosson

関連する問題