问题

Html.ActionLink怎么包裹其他代码?

回答
在ASP.NET MVC中,`Html.ActionLink` 是一个非常方便的助手方法,它能够生成一个 `` 标签,指向某个控制器中的特定Action方法。很多时候,我们不仅仅需要一个简单的链接文本,而是想用一段更丰富的HTML内容来作为链接的显示,例如一个带有图片的按钮,或者一段带有样式的文字。这时候,我们就需要将其他的HTML代码“包裹”在`Html.ActionLink`的外面,让`ActionLink`生成的``标签包含这些自定义的内容。

要做到这一点,你可以利用`Html.ActionLink`的一个重载方法,这个方法接受一个 `helper` 参数。这个 `helper` 参数实际上是一个委托,它负责生成链接内部的HTML内容。你可以将你想要包裹的HTML代码写在一个lambda表达式或者一个普通的方法中,然后将其传递给`Html.ActionLink`。

举个例子,假设你想创建一个链接,它的显示内容是一个带有“Edit”文字的``标签,并且这个``标签还有一个CSS类`.linkbutton`。你可以这样做:

```html
@Html.ActionLink("Edit", // ActionName
"Edit", // ControllerName
new { id = item.ID }, // RouteValues
new { @class = "btn btnprimary" } // HtmlAttributes
)
```

这看起来是生成了一个带有class的链接。但如果你想包裹的是一段更复杂的HTML,比如说,你想用一个`
`来包含链接文本,并且这个`
`有特定的样式:

```html
@Html.ActionLink(
linkText: "My Custom Link", // 链接显示的文字,这个参数实际上会被lambda表达式覆盖
actionName: "Details", // 要指向的Action方法名
controllerName: "Products", // 要指向的Controller名
routeValues: new { id = 123 }, // 传递给Action方法的路由参数
htmlAttributes: new { @class = "customlinkstyle" }, // `
`标签本身的HTML属性
// 下面这个参数就是关键,它是一个Func委托,用来生成链接内部的内容
helper: @

Click Me! Product 123


)
```

在这个例子中,`linkText`参数 (`"My Custom Link"`) 实际上是被`helper`参数中的HTML内容所覆盖了。`helper`参数接受一个`@...`块(这是Razor语法的特性,用于表示一段HTML),你可以在这个块里写任何你想要的HTML代码。这些代码会被渲染,然后嵌入到`
`标签的内部。

思考一下这个`helper`参数的工作原理。它实际上是 Razor 引擎在编译你的视图时,会将其转换成一个 `Func` 委托。当你调用`Html.ActionLink`并传入这个委托时,MVC框架会在生成`
`标签时,调用这个委托,然后将委托返回的`HelperResult`(也就是你写的HTML)作为链接的显示内容。

所以,核心在于使用那个接受`helper`参数的`Html.ActionLink`重载。你可以传递一个lambda表达式,表达式的返回值就是你想放在链接里的HTML。

另一种更常见、也更直观的做法是,直接将`Html.ActionLink`包裹在你想要的内容外面。这与你之前描述的“包裹”的概念可能有些不同,但它能达到同样的效果,而且在很多情况下更易读。

例如,你想让一个图片变成一个链接:

```html

Company Logo

```

这种方式,你手动构建了``标签,并且通过`Url.Action`来生成正确的URL。如果你想用`Html.ActionLink`来完成这个,你可以这样做:

```html
@Html.ActionLink(
linkText: "", // 链接文本为空,因为我们用图片作为内容
actionName: "Index",
controllerName: "Home",
routeValues: null, // 如果不需要路由参数,可以传null
htmlAttributes: null // 如果`
`标签本身不需要额外属性,可以传null
)
{
Company Logo
}
```

请注意,上面的写法是不正确的。`Html.ActionLink`的重载方式并没有直接接受一个Razor代码块的方式来包裹。正确的做法是使用那个`helper`参数。

让我们回到使用`helper`参数来包裹复杂HTML的例子,并且稍微调整一下,使其更清晰:

假设你要生成一个链接,这个链接的文本是一个带有特定样式的按钮,并且这个按钮包含一个图标。

```html
@Html.ActionLink(
linkText: "Placeholder", // 这个值会被后面的helper覆盖
actionName: "Edit",
controllerName: "Items",
routeValues: new { id = ViewBag.ItemId },
htmlAttributes: null, // `
`标签本身可以不需要额外属性
helper: @


)
```

在这里,`Html.ActionLink`的第一个`linkText`参数 (`"Placeholder"`) 实际上没有被渲染出来,因为它被`helper`参数提供的HTML完全替换了。`helper`参数负责生成完整的、包含``标签(图标)和`Edit Item`文本的`

网友意见

user avatar

你要好看的话就试一下Jumony for ASP.NET MVC。

可以这么写:

       <a action="xxx" controller="xxx"><span></span></a>      

用Razor就老老实实写Url.Action吧。。。。

user avatar

不如直接写 <a

href=“@Url.Action

” >...</a> 吧

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有