HTML.ActionLink "と "Url.Action "には何か違いがあるのでしょうか、それとも同じことをする2つの方法なのでしょうか?
また、どのような場合にどちらかを選択する必要がありますか?
はい、違いがあります。Html.ActionLinkは、
タグを生成するのに対し、
Url.Action`はURLのみを返します。
例えば、以下のようになります。
@Html.ActionLink("link text", "someaction", "somecontroller", new { id = "123" }, null)
が生成されます。
<a href="/somecontroller/someaction/123">link text</a>
となり、Url.Action("someaction", "somecontroller", new { id = "123" })
が生成されます。
/somecontroller/someaction/123
また、子コントローラのアクションを実行するHtml.Actionもあります。
Html.ActionLink
は、<a href="..."></a>
タグを自動的に生成します。
Url.Action
は、URLのみを生成します。
例えば、以下のようになります。
@Html.ActionLink("link text", "actionName", "controllerName", new { id = "<id>" }, null)
が生成されます。
<a href="/controllerName/actionName/<id>">link text</a>
と
@Url.Action("actionName", "controllerName", new { id = "<id>" })
が生成されます。
/controllerName/actionName/<id>
私が気に入っている一番のプラスポイントは、Url.Action(...)
を使うことです。
自分でアンカータグを作り、他の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>
}
上の例では、何かアクションを起こすためのボタンが必要な場合は@Url.Actionを使うのに対し、単にリンクが必要な場合は@Html.ActionLinkを使うことがわかります。 ポイントは、アクションを伴う要素(HTML)を使用しなければならない場合、URLを使用することです。