2011-11-12 8 views
5

ASP.NET MVC 2 esegue il rendering di un collegamento (ad esempio <a>) per eliminare i record.Creazione dell'estensione del pulsante Elimina MVC - Come estendere l'helper Html di MVC?

Può essere dannoso consentire l'eliminazione di azioni tramite azioni GET, quindi desidero eseguire l'eliminazione emettendo un POST.

ho creato il seguente pezzo di codice:

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

Ora vorrei aggiungere questo codice al helper HTML come un metodo di estensione:

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

Ora qui è dove ho rimasto bloccato. Come faccio a far funzionare questo pulsante di cancellazione?

risposta

4

Se si desidera generare il codice completo, si sta sbagliando erroneamente di restituire uno MvcForm. Si desidera che restituisca un MvcHtmlString e costruisca l'HTML all'interno del metodo. In questo modo è possibile utilizzarlo come:

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

Generazione direttamente il codice HTML (nota: non testato, potrebbe essere necessario adeguati controlli nulli, ecc)

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

Un'alternativa sarebbe quella di riutilizzare le helper delle form e Response.Write, ma hanno il metodo restituisce una stringa (vuoto), forse qualcosa di simile:

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

Ho modificato l'ultima risposta che, dopo alcune modifiche, sembra funzionare correttamente. –

+0

Informazioni dettagliate su come eseguire 'response.Write' in HtmlHelper. Grazie!! Vorrei poter votare di nuovo. –

1

Mentre penso che un elemento <form> farà il trucco, non è molto AJAX-y.

Piuttosto, perché non usare jQuery, wire up to the click event per le opportune <a> link, e poi 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 
     });  
    }); 
}); 

Il vantaggio di questo è di mantenere il vostro codice HTML molto più pulita rispetto a quando è stato inserito un <form> per ogni elemento che si voleva eliminare e semanticamente rilevanti, markup pulito è sempre un plus da uno sviluppo, SEO e altre prospettive.

+0

Mi piace l'idea di utilizzare una sorta di post ajax. L'argomento di HTML più pulito mi rimane nella testa. Non so se questo è l'obiettivo di un'app aziendale. Da quando ho letto http://www.hanselman.com/blog/JavaScriptIsAssemblyLanguageForTheWebSematicMarkupIsDeadCleanVsMachinecodedHTML.aspx, mi sono chiesto se le app aziendali dovrebbero anche occuparsi di scrivere html pulito. –

+0

@ KeesC.Bakker: non direi che è un obiettivo, ma un HTML più pulito è un obiettivo delle buone pratiche di sviluppo IMO; di fronte a un muro di HTML, sarà un incubo attraversare tutto per vedere dove qualcosa è andato storto; con jQuery (o qualcosa di simile) hai una migliore separazione delle preoccupazioni; Inoltre, stai utilizzando un codice testato dalla battaglia. Infine, avrai più persone in libertà che potranno aiutarti quando seguirai lo stesso paradigma piuttosto che tentare di capire da solo il caso di nicchia perché hai digerito. – casperOne

+0

Sono favorevole alla gestione tramite AJAX, ma questo si interromperà se c'è un errore javascript sulla pagina o javascript è disattivato. È possibile intercettare il modulo di invio con il gestore e farlo tramite AJAX - o anche scartare i moduli lasciando solo i pulsanti con un gestore adatto, se necessario. – tvanfosson

Problemi correlati