为何闭合标签在视图中显示?ASP.NET MVC代码问题咨询
问题根源与解决方案
首先得戳破你代码里的核心问题:@Html.ActionLink方法本身会生成完整的标签,但你现在手动在外层又套了一层标签,这就造成了HTML里标签的非法嵌套——这种结构不符合HTML规范,浏览器解析时只能强行修复,结果就是你遇到的“闭合标签显示在页面”或者“报
举个实际渲染后的例子,你写的代码:
<p class="options"> <a class="btn btn-default btn-lg selector1" @Html.ActionLink("Login", "Login", "Account")></a> <a class="btn btn-default btn-lg selector2" @Html.ActionLink("Register", "Register", "Account")> </a> </p>
最终会变成这种无效的嵌套结构:
<p class="options"> <a class="btn btn-default btn-lg selector1"><a href="/Account/Login">Login</a></a> <a class="btn btn-default btn-lg selector2"><a href="/Account/Register">Register</a> </a> </p>
浏览器根本不知道该怎么处理这种嵌套链接,自然就会出现各种异常。
正确的解决写法
你完全不需要手动套标签,直接用Html.ActionLink的重载方法,把CSS类名作为参数传进去就行:
<p class="options"> @Html.ActionLink("Login", "Login", "Account", null, new { @class = "btn btn-default btn-lg selector1" }) @Html.ActionLink("Register", "Register", "Account", null, new { @class = "btn btn-default btn-lg selector2" }) </p>
这个重载的参数逻辑很清晰:
- 链接显示的文本内容
- 目标控制器的方法名
- 控制器名称
- 路由参数(这里不需要就传
null) - HTML属性(class前面加
@是因为它是C#的关键字,避免语法冲突)
这样渲染后会生成完全合规的HTML:
<p class="options"> <a class="btn btn-default btn-lg selector1" href="/Account/Login">Login</a> <a class="btn btn-default btn-lg selector2" href="/Account/Register">Register</a> </p>
既没有嵌套问题,也不会出现闭合标签的异常,完美解决你的困扰。
为啥其他场景没问题?
你说其他场景不写闭合标签没事,大概率是那些场景里你用的不是ActionLink这种会生成完整标签的辅助方法——比如只是在里放普通文本、或者输出不包含闭合标签的内容,这时候手动写的开闭标签是正常的。但ActionLink的设计初衷就是帮你生成完整的标签,所以千万别画蛇添足再套一层了。
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

