【问题标题】:.net core 2.2 call action using taghelpers and passing querystring.net core 2.2 使用 taghelpers 调用操作并传递查询字符串
【发布时间】:2023-03-17 20:42:01
【问题描述】:

我在控制器 A 中有一个简单的搜索操作。我知道它不是最有效的,但它似乎有效。

[HttpPost, ActionName("Search")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Search(string cellnumberFragment, string clientFragment, string serviceFragment, string deviceFragment, string networkFragment, string serialFragment)
{
    var thirdPartySims = _context.ThirdPartySim.AsQueryable();

    if (!string.IsNullOrWhiteSpace(cellnumberFragment)) thirdPartySims = thirdPartySims.Where(s => s.Cellnumber.Contains(cellnumberFragment));
    if (!string.IsNullOrWhiteSpace(clientFragment)) thirdPartySims = thirdPartySims.Where(s => s.Client.Name.Contains(clientFragment));
    if (!string.IsNullOrWhiteSpace(serviceFragment)) thirdPartySims = thirdPartySims.Where(s => s.Service.Name.Contains(serviceFragment));
    if (!string.IsNullOrWhiteSpace(deviceFragment)) thirdPartySims = thirdPartySims.Where(s => s.DeviceName.Contains(deviceFragment));
    if (!string.IsNullOrWhiteSpace(networkFragment)) thirdPartySims = thirdPartySims.Where(s => s.Network.Name.Contains(networkFragment));
    if (!string.IsNullOrWhiteSpace(serialFragment)) thirdPartySims = thirdPartySims.Where(s => s.Serial.Contains(serialFragment));

    return View(await thirdPartySims.ToListAsync());
}

在控制器 B 的视图中,我想要一个指向搜索控制器的链接,将指定的值传递给幕后的搜索。字典允许我清楚地指定每个动作参数。然后添加标签助手asp-all-route-data

@{
    var parms = new Dictionary<string, string>
    {
        {"cellnumberFragment", null },
        {"clientFragment", Model.Name },
        {"serviceFragment", null },
        {"deviceFragment", null },
        {"networkFragment", null },
        {"serialFragment", null }
    };
}
<a asp-controller="ThirdPartySims" asp-action="Search" asp-all-route-data="parms">List all SIM's for client</a>

这正在创建一个类似

的链接
http://localhost:52827/ThirdPartySims/Search?clientFragment=Not%20Specified

当我通过索引视图正常加载搜索时,它工作正常。当以这种方式运行时,通过使用标签处理程序的链接,我得到 ​​p>

This page isn’t working If the problem continues, contact the site owner.
HTTP ERROR 405

我的 vs2019 日志说

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: 
Request starting HTTP/1.1 GET 
http://localhost:52827/ThirdPartySims/Search  
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: 
Executing endpoint '405 HTTP Method Not Supported'
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: 
Executed endpoint '405 HTTP Method Not Supported'
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: 
Request finished in 6.3539ms 405 

【问题讨论】:

  • "当我正常加载搜索时,它工作正常。当以这种方式运行时,我得到"什么是正常的,这种方式是什么?
  • @LazZiya 我已经编辑清楚这个和那个。

标签: asp.net-mvc asp.net-mvc-routing asp.net-core-2.2


【解决方案1】:

尝试添加[FromQuery]属性

[HttpPost, ActionName("Search")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Search([FromQuery] string cellnumberFragment, string clientFragment, string serviceFragment, string deviceFragment, string networkFragment, string serialFragment)
{
    var thirdPartySims = _context.ThirdPartySim.AsQueryable();

    if (!string.IsNullOrWhiteSpace(cellnumberFragment)) thirdPartySims = thirdPartySims.Where(s => s.Cellnumber.Contains(cellnumberFragment));
    if (!string.IsNullOrWhiteSpace(clientFragment)) thirdPartySims = thirdPartySims.Where(s => s.Client.Name.Contains(clientFragment));
    if (!string.IsNullOrWhiteSpace(serviceFragment)) thirdPartySims = thirdPartySims.Where(s => s.Service.Name.Contains(serviceFragment));
    if (!string.IsNullOrWhiteSpace(deviceFragment)) thirdPartySims = thirdPartySims.Where(s => s.DeviceName.Contains(deviceFragment));
    if (!string.IsNullOrWhiteSpace(networkFragment)) thirdPartySims = thirdPartySims.Where(s => s.Network.Name.Contains(networkFragment));
    if (!string.IsNullOrWhiteSpace(serialFragment)) thirdPartySims = thirdPartySims.Where(s => s.Serial.Contains(serialFragment));

    return View(await thirdPartySims.ToListAsync());
}

【讨论】:

  • 我加进去了,看不出有什么效果
【解决方案2】:

看起来像一个获取、发布相关的问题。

"当我通过索引视图正常加载搜索时"

我猜你有一个带有默认 post 方法的搜索表单,所以这是一个 post 请求,因为你确实有一个 post 搜索方法 [HttpPost] 它工作正常。

"当以这种方式运行时,通过使用标签处理程序的链接,我得到..."

实际上问题不在于标签助手,而是使用链接意味着它是一个获取请求,这就是您收到错误的原因。

解决方案 1:

如果您需要通过链接访问搜索功能,只需将该方法标记为 get HttpGet 并删除防伪令牌验证,这样您就可以使用包含在 url 中的搜索参数的链接。

[HttpGet, ActionName("Search")]
public async Task<IActionResult> Search([FromQuery] string cellnumberFragment, string clientFragment, string serviceFragment, string deviceFragment, string networkFragment, string serialFragment)
{
    var thirdPartySims = _context.ThirdPartySim.AsQueryable();

    if (!string.IsNullOrWhiteSpace(cellnumberFragment)) thirdPartySims = thirdPartySims.Where(s => s.Cellnumber.Contains(cellnumberFragment));
    if (!string.IsNullOrWhiteSpace(clientFragment)) thirdPartySims = thirdPartySims.Where(s => s.Client.Name.Contains(clientFragment));
    if (!string.IsNullOrWhiteSpace(serviceFragment)) thirdPartySims = thirdPartySims.Where(s => s.Service.Name.Contains(serviceFragment));
    if (!string.IsNullOrWhiteSpace(deviceFragment)) thirdPartySims = thirdPartySims.Where(s => s.DeviceName.Contains(deviceFragment));
    if (!string.IsNullOrWhiteSpace(networkFragment)) thirdPartySims = thirdPartySims.Where(s => s.Network.Name.Contains(networkFragment));
    if (!string.IsNullOrWhiteSpace(serialFragment)) thirdPartySims = thirdPartySims.Where(s => s.Serial.Contains(serialFragment));

    return View(await thirdPartySims.ToListAsync());
}

解决方案 2:

只需向搜索功能发出帖子请求,如果您仍然需要使用链接,您可能会看到这个答案https://stackoverflow.com/a/33880971/5519026

【讨论】:

  • 感谢您认识到我的实际问题。使用解决方案 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多