You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Umbraco v9中调用带参数的特定控制器方法并获取数据的实现问题

解决Umbraco v9中@Html.ActionLink传递参数无效的问题

看起来你遇到的核心问题是请求方式不匹配,加上对Umbraco RenderController的路由逻辑理解有偏差,咱们一步步来搞定:

问题根源分析

你控制器里的SearchResult方法标记了[HttpPost],但@Html.ActionLink生成的是GET请求的跳转链接,同时前端JS也是用location.href发起GET跳转——这就导致请求根本不会命中你写的SearchResult方法,自然拿不到参数。而你手动输入URL时能生效,大概率是误打误撞触发了Index方法(或者测试时访问了其他GET方法),并不是你预期的逻辑。

解决方案步骤

1. 修正控制器的请求方式

SearchResult方法的[HttpPost]改成[HttpGet],因为页面跳转属于GET请求:

[HttpGet] // 替换原来的HttpPost
public IActionResult SearchResult(string searchString) {
    var results = SearchRepository.SearchString(searchString);
    var model = new SearchResult(CurrentPage, PublishedValueFallback);
    model.SearchResults = results; // 别忘了把查询结果绑定到模型,不然视图拿不到数据
    return View("~/Views/SearchResult.cshtml", model);
}

明确指定控制器、Action和参数,避免路由匹配错误:

<!-- 生成带参数的跳转链接,"默认关键词"可替换为动态值,比如Model属性 -->
@Html.ActionLink("执行搜索", "SearchResult", "SearchResult", new { searchString = "默认关键词" }, null)

如果要结合输入框的动态值,更推荐用GET表单提交,符合搜索场景的交互逻辑:

<form asp-controller="SearchResult" asp-action="SearchResult" method="get">
    <input type="text" name="searchString" id="searchLabel" placeholder="输入关键词" />
    <button type="submit">搜索</button>
</form>

3. 优化前端JS的URL生成

不要硬编码URL,用Umbraco的Url.Action生成正确的路由地址,同时对参数编码避免特殊字符问题:

function Search() {
    var searchString = document.getElementById("searchLabel").value;
    // 用Url.Action生成适配Umbraco节点的路由地址
    var baseUrl = '@Url.Action("SearchResult", "SearchResult")';
    var url = baseUrl + '?searchString=' + encodeURIComponent(searchString);
    location.href = url;
}

4. 验证Umbraco路由配置

确保SearchResultController对应的Umbraco文档类型已正确创建,且节点URL(比如/search)能正常访问——RenderController和Umbraco内容节点绑定,路由会优先匹配节点路径,所以生成的搜索链接应该是/search/SearchResult?searchString=xxx,能正确命中你的Action方法。

额外提示

如果业务需要用POST请求(比如搜索参数较多),不要用location.hrefActionLink跳转,改用AJAX提交表单并处理返回结果。但普通搜索场景下,GET请求更合适,也符合浏览器前进/后退的逻辑。

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

火山引擎 最新活动