.net core 2.2 调用操作使用 taghelpers 并传递查询字符串
.net core 2.2 call action using taghelpers and passing querystring
我在控制器 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 的视图中,我想要一个 link 到搜索控制器,将指定的值传递到幕后的搜索。字典允许我清楚地指定每个动作参数。然后添加标签助手 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>
这正在创建 link 类似
http://localhost:52827/ThirdPartySims/Search?clientFragment=Not%20Specified
当我通过索引视图正常加载搜索时,它工作正常。当 运行 这样,通过 link 使用标签处理程序,我得到
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
尝试添加 [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());
}
看起来像一个问题,post 相关问题。
"When I load the Search normally, via the Index view"
我猜你有一个默认 post 方法的搜索表单,所以这是一个 post 请求,因为你确实有 post 搜索方法 [HttpPost]
它工作正常。
"When run this way, via a link using tag-handlers, I get..."
实际上问题不在于标签助手,但使用 links 意味着它是一个获取请求,这就是您收到错误的原因。
解决方案 1:
如果您需要通过 links 访问搜索功能,只需将方法标记为 get HttpGet
并删除防伪令牌验证,这样您就可以使用 link url.
中包含搜索参数的 s
[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:
只需向搜索功能发出 post 请求,如果您仍然需要使用 link 您可能会看到此答案
我在控制器 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 的视图中,我想要一个 link 到搜索控制器,将指定的值传递到幕后的搜索。字典允许我清楚地指定每个动作参数。然后添加标签助手 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>
这正在创建 link 类似
http://localhost:52827/ThirdPartySims/Search?clientFragment=Not%20Specified
当我通过索引视图正常加载搜索时,它工作正常。当 运行 这样,通过 link 使用标签处理程序,我得到
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
尝试添加 [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());
}
看起来像一个问题,post 相关问题。
"When I load the Search normally, via the Index view"
我猜你有一个默认 post 方法的搜索表单,所以这是一个 post 请求,因为你确实有 post 搜索方法 [HttpPost]
它工作正常。
"When run this way, via a link using tag-handlers, I get..."
实际上问题不在于标签助手,但使用 links 意味着它是一个获取请求,这就是您收到错误的原因。
解决方案 1:
如果您需要通过 links 访问搜索功能,只需将方法标记为 get HttpGet
并删除防伪令牌验证,这样您就可以使用 link 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:
只需向搜索功能发出 post 请求,如果您仍然需要使用 link 您可能会看到此答案