C'è qualche differenza tra HTML.ActionLink
vs Url.Action
o sono solo due modi di fare la stessa cosa?
Quando dovrei preferire l'uno all'altro?
C'è qualche differenza tra HTML.ActionLink
vs Url.Action
o sono solo due modi di fare la stessa cosa?
Quando dovrei preferire l'uno all'altro?
Risposte:
Sì, c'è differenza. Html.ActionLink
genera un <a href=".."></a>
tag mentre Url.Action
restituisce solo un URL.
Per esempio:
@Html.ActionLink("link text", "someaction", "somecontroller", new { id = "123" }, null)
genera:
<a href="/somecontroller/someaction/123">link text</a>
e Url.Action("someaction", "somecontroller", new { id = "123" })
genera:
/somecontroller/someaction/123
C'è anche Html.Action che esegue un'azione del controller figlio.
<a>
). Utilizzare Url.Action quando è necessario generare solo un URL (questo potrebbe essere utilizzato anche in un'azione del controller).
Url.Action
è molto più performat di Html.ActionLink
. Avevo un elenco di 6.000 articoli che ne contenevano 2 Html.ActionLinks
. Ci sono voluti 6.600 ms per rendere l'elenco. Senza quello Html.ActionLinks
ci sono voluti 52ms. Il suo utilizzo Url.Action
ha richiesto 270 ms. Concesso, 6000 articoli sono un grande elenco, ma ho pensato di aggiungerlo per riferimento futuro.
Html.ActionLink
genera <a href=".."></a>
automaticamente un tag.
Url.Action
genera solo un url.
Per esempio:
@Html.ActionLink("link text", "actionName", "controllerName", new { id = "<id>" }, null)
genera:
<a href="/controllerName/actionName/<id>">link text</a>
e
@Url.Action("actionName", "controllerName", new { id = "<id>" })
genera:
/controllerName/actionName/<id>
Il miglior punto in più che mi piace sta usando Url.Action(...)
Stai creando tag di ancoraggio per conto tuo in cui puoi impostare facilmente il tuo testo collegato anche con qualche altro tag HTML.
<a href="@Url.Action("actionName", "controllerName", new { id = "<id>" })">
<img src="<ImageUrl>" style"width:<somewidth>;height:<someheight> />
@Html.DisplayFor(model => model.<SomeModelField>)
</a>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Company", FormMethod.Get))
{
<p>
Find by Name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Search" />
<input type="button" value="Clear" onclick="location.href='@Url.Action("Index","Company")'"/>
</p>
}
Nell'esempio sopra puoi vedere che se ho specificamente bisogno di un pulsante per fare qualche azione, devo farlo con @ Url.Action mentre se voglio solo un link userò @ Html.ActionLink. Il punto è quando devi usare qualche elemento (HTML) con l'URL di azione.
@HTML.ActionLink
genera a HTML anchor tag
. Mentre @Url.Action
genera una URL
per te. Puoi facilmente capirlo da;
// 1. <a href="https://stackoverflow.com/ControllerName/ActionMethod">Item Definition</a>
@HTML.ActionLink("Item Definition", "ActionMethod", "ControllerName")
// 2. /ControllerName/ActionMethod
@Url.Action("ActionMethod", "ControllerName")
// 3. <a href="https://stackoverflow.com/ControllerName/ActionMethod">Item Definition</a>
<a href="@Url.Action("ActionMethod", "ControllerName")"> Item Definition</a>
Entrambi questi approcci sono diversi e dipende totalmente dalle tue necessità.
Puoi facilmente presentare Html.ActionLink come pulsante usando lo stile CSS appropriato. Per esempio:
@Html.ActionLink("Save", "ActionMethod", "Controller", new { @class = "btn btn-primary" })
Ho usato il codice qui sotto per creare un pulsante e ha funzionato per me.
<input type="button" value="PDF" onclick="location.href='@Url.Action("Export","tblOrder")'"/>
Html.ActionLink
per generarli. Non provare a fare tali micro ottimizzazioni. Finirai con un brutto codice nelle tue opinioni.