C'è qualche differenza tra HTML.ActionLink
vs Url.Action
o sono solo due modi di fare la stessa cosa?
Quando dovrei preferire uno rispetto all'altro?
Sì, c'è una differenza. Html.ActionLink
genera un tag <a href="..""/a>
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 controller figlio.
Html.ActionLink
genera automaticamente un tag <a href=".."""/a>
.
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 a favore che mi piace è usare Url.Action(...)
Stai creando un tag di ancoraggio da solo dove puoi impostare il tuo testo collegato facilmente 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 precedente si può 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 è che quando si deve usare qualche elemento (HTML) con l'azione si usa l'url.