.net core 2.2 вызов действия с использованием taghelpers и передачи строки запроса - PullRequest
0 голосов
/ 18 июня 2019

У меня есть простое действие поиска в Controller 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());
}

В View for Controller B я хочу иметь ссылку наКонтроллер поиска, передавая указанные значения в Поиск за кулисами.Словарь позволяет мне четко указать каждый параметр действия.Затем он добавляется с помощью тега helper 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

Когда я обычно загружаю Поиск через представление Index, он работает нормально.При запуске таким способом по ссылке, использующей обработчики тегов, я получаю

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 

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Похоже, получить, пост, связанный вопрос.

" Когда я загружаю Поиск нормально, через индексное представление "

Полагаю, у вас есть поисковая форма с методом публикации по умолчанию, так что это запрос на публикацию, и, поскольку у вас есть метод поиска по почте [HttpPost], он работает нормально.

" При запуске по ссылке через обработчики тегов я получаю ... "

На самом деле проблема не в помощниках тегов, но использование ссылок означает, что это запрос get, и поэтому вы получаете сообщение об ошибке.

Решение 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

0 голосов
/ 18 июня 2019

Попробуйте добавить [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());
}
...