You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将含@Html.ActionLinks的string类型列表作为Model从Controller传至View?

问题分析与解决方案

你遇到的核心问题是:Razor不会重新解析已经作为字符串传递到View的Razor语法代码。

当你在Controller里把包含@Html.ActionLink(...)的字符串存入列表,传到View后,Razor引擎只会把这个字符串当作普通文本处理,不会执行其中的Html.ActionLink辅助方法——因为Razor的编译过程在View渲染前就完成了,它不会扫描你传入的字符串里的Razor标记。而普通的<a href="...">标签是纯HTML,所以用HtmlString输出能正常渲染。

下面给你两种可行的解决方案:


方案1:传递参数而非预构建Razor代码(推荐)

把生成ActionLink需要的参数封装成ViewModel,在View里直接调用Html.ActionLink,这样既符合MVC的职责分离(视图逻辑留在View),也避免了Razor解析问题。

步骤1:创建ViewModel类

public class LinkViewModel
{
    public string LinkText { get; set; }
    public string ActionName { get; set; }
    public string ControllerName { get; set; }
    // 可选:路由参数和HTML属性
    public object RouteValues { get; set; }
    public object HtmlAttributes { get; set; }
}

步骤2:在Controller中构建参数列表

public ActionResult YourAction()
{
    var links = new List<LinkViewModel>
    {
        new LinkViewModel
        {
            LinkText = "Go to Home Page",
            ActionName = "Index",
            ControllerName = "Home"
        },
        new LinkViewModel
        {
            LinkText = "View Details",
            ActionName = "Details",
            ControllerName = "Products",
            RouteValues = new { id = 123 },
            HtmlAttributes = new { @class = "btn btn-primary" }
        }
    };
    return View(links);
}
@model List<LinkViewModel>

@foreach (var link in Model)
{
    @Html.ActionLink(link.LinkText, link.ActionName, link.ControllerName, link.RouteValues, link.HtmlAttributes)
}

方案2:在Controller中直接生成HTML字符串(不推荐)

如果一定要在Controller里生成完整的HTML(不建议,因为违反了MVC的关注点分离原则),可以手动实例化HtmlHelper来调用ActionLink方法,生成HTML字符串后再传递到View。

代码示例(Controller中)

using System.Web.Mvc;
using System.Web.Mvc.Html;

public ActionResult YourAction()
{
    // 手动创建HtmlHelper实例
    var viewContext = new ViewContext(
        ControllerContext,
        new WebFormView("DummyView"), // 不需要实际视图,传个占位符即可
        new ViewDataDictionary(),
        new TempDataDictionary()
    );
    var htmlHelper = new HtmlHelper(viewContext, new ViewPage());

    // 生成ActionLink的HTML字符串
    var actionLinkHtml = htmlHelper.ActionLink(
        "Go to About",
        "About",
        "Home"
    ).ToString();

    var htmlList = new List<string> { actionLinkHtml };
    return View(htmlList);
}

View中输出方式不变

@model List<string>

@{
    foreach (var line in Model)
    {
        var myHTML = new HtmlString(line);
        @myHTML
    }
}

总结一下,方案1是更符合MVC设计思想的做法,能让代码更易维护和扩展;方案2适合特殊场景,但尽量避免使用。

内容的提问来源于stack exchange,提问作者Jay Meltzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:15:34