如何通过锚标签调用带参数的MVC5控制器Index视图?
首先先揪出你代码里一个明显的小错误:你的JsRender模板里,href最后多了一个额外的右括号 ),这会导致生成的URL格式无效,服务器根本没法正确解析,先把这个括号删掉:
<script id="applicationDetailstemplate" type="text/x-jsrender"> <a href="../../../Applicants/Applications/{{:id}}">{{:position}}</a> </script>
接下来是核心问题:路由参数名不匹配。你的控制器Action参数是Guid? ApplicationId,但ASP.NET MVC的默认路由(定义在RouteConfig.cs里)默认的路径参数名是id,所以当你把ID放在URL路径里时,MVC没办法自动把路径里的id绑定到ApplicationId这个参数上,自然就触发不了预期的逻辑。
你可以通过以下几种方式解决这个问题:
方法1:修改Action参数名适配默认路由
最简单的方式就是把控制器里的参数名改成id,这样默认路由就能自动完成参数绑定:
public class ApplicationsController : Controller { // GET: Applicants/Applications public ActionResult Index(Guid? id) { // 这里用id代替原来的ApplicationId做业务逻辑处理 return View("Application Details"); } }
方法2:自定义专属路由规则
如果不想修改参数名,可以在RouteConfig.cs里添加一个专门匹配这个Action的路由,明确指定参数名为ApplicationId:
routes.MapRoute( name: "ApplicationDetails", url: "Applicants/Applications/{ApplicationId}", defaults: new { controller = "Applications", action = "Index" } );
注意要把这个路由放在默认路由的前面,因为MVC会按照路由定义的顺序进行匹配,先匹配到的路由会被优先使用。
方法3:用查询字符串传递参数
如果不想改动路由或参数名,直接用查询字符串传递ApplicationId是最稳妥的方式,这种方式不依赖路由规则,MVC会自动把查询字符串里的参数绑定到Action的对应参数上:
<script id="applicationDetailstemplate" type="text/x-jsrender"> <a href="../../../Applicants/Applications?ApplicationId={{:id}}">{{:position}}</a> </script>
另外,建议你尽量使用MVC的Url.Action辅助方法生成URL,而不是硬写相对路径,这样能避免页面层级变化导致的路径错误。如果是在JsRender里使用,可以先在Razor视图里生成基础URL,再在模板里拼接:
@{ // 在Razor视图中生成Action的基础URL var baseUrl = Url.Action("Index", "Applications", new { area = "Applicants" }); } <script id="applicationDetailstemplate" type="text/x-jsrender"> <a href="@baseUrl?ApplicationId={{:id}}">{{:position}}</a> </script>
最后,修改后记得测试一下生成的URL是否正确——点击链接后看浏览器地址栏的URL有没有多余字符,参数是否正确传递,这样就能确保Action被正确调用并获取到参数了。
内容的提问来源于stack exchange,提问作者Shalini Raj

