2011-11-12 9 views
5

ASP.NET MVC 2 kayıtları silmek için bir bağlantı oluşturur (örn. <a>).MVC Sil oluşturma düğmesi uzantısı - MVC'nin Html yardımcı programını nasıl genişletebilirim?

GET eylemleri aracılığıyla silme eylemlerine izin vermek zararlı olabilir, bu yüzden bir POST yayınlayarak silme işlemini yapmak istiyorum.

ben aşağıdaki kod parçasını oluşturduk: Artık

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

Ben bir uzantısı yöntemi olarak Html yardımcı için bu kodu eklemek istiyorum: Şimdi burada

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

nerede ben takılmak. Çalışmak için bu silme düğmesini nasıl alabilirim?

cevap

4

Tüm kodu oluşturmak istiyorsanız, bir MvcForm döndürmesini yanlış anlıyorsunuz. Bir MvcHtmlString döndürmesini ve HTML'yi yöntem içinde oluşturmasını istiyorsunuz.

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

doğrudan HTML oluşturma: olarak kullanabilirsiniz Bu şekilde (not: denenmemiş, sen vb uygun boş çekler gerekebilir)

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()); 
} 

alternatif formu yardımcıları yeniden olurdu Ben <form> eleman hile olacaktır düşünüyorum ederken çok AJAX-y değil,

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

Son yanıtı - bazı değişikliklerden sonra - düzgün çalışıyor gibi görünüyor. –

+0

HtmlHelper'da bir 'response.Write 'nasıl yapılacağı hakkında çok güzel bir fikir. Teşekkürler!! Tekrar oy verebilseydim. –

1

: Response.Write ancak sahip yöntem belki bir şey gibi bir (boş) dize döndürür.

Aksine, neden olmasın uygun <a> bağlantılar için jQuery, wire up to the click event ve sonra issue an HTTP POST to the server yourself kullanabilir?

$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 
     });  
    }); 
}); 

Bunun avantajı anlamsal ilgili her öğe için bir <form> takılıysa silmek istediğini daha temiz ve daha temiz biçimlendirme her zaman geliştirme, SEO bir artı HTML tutmak olduğunu ve diğer perspektifler.

+0

Bir çeşit ajax yayını kullanma fikrini beğeniyorum. Kafamdaki temiz HTML çubuklarının argümanı. Bir iş uygulamasının amacı bu mu bilmiyorum. Http://www.hanselman.com/blog/JavaScriptIsAssemblyLanguageForTheWebSematicMarkupIsDeadCleanVsMachinecodedHTML.aspx'i okuduğumdan beri, iş uygulamalarının bile temiz bir html yazmak için katılması gerektiğini merak ettim. –

+0

@ KeesC.Bakker: Bunun bir hedef olduğunu söyleyemem, ancak temiz HTML iyi geliştirme uygulamalarının hedefi IMO; bir HTML duvarı ile karşı karşıya kaldığında, bir şeyin yanlış gittiğini görmek için her şeyin içinden geçecek bir kabus olacak; jQuery ile (ya da benzer bir şey) endişelerin daha iyi ayrılması; Ayrıca, savaşta test edilmiş kod kullanıyorsunuz. Son olarak, vahşi olanlarda daha fazla insanın olması gerekir, çünkü aynı paradigmayı takip ettiğinizde, nişanızı kendiniz çözdüğünüz için nişanızı kendiniz çözmeye çalışmaktan ziyade yardımcı olabilirsiniz. – casperOne

+0

AJAX ile işleme konusunda iyiyim, ancak bu sayfada bir javascript hatası varsa veya javascript kapalıysa bu durum kesilir. Form gönderilerini işleyici ile kesip, AJAX üzerinden yapabilir ve hatta eğer gerekliyse, sadece düğmeleri uygun bir işleyiciyle birlikte bırakabilirsiniz. – tvanfosson

İlgili konular