Возможно ли получить запрос HTTP без передачи очень длинной строки в URL? - PullRequest
1 голос
/ 04 июня 2019

Какой самый эффективный способ передать очень длинный запрос GET?Я вижу, что аналогичный вопрос был размещен здесь: Очень длинный запрос http get , который предлагает использовать запрос post вместо get?Почему это так?

В качестве примера у меня есть приложение, которое включает 4 мультиселекта и выпадающий список.Пользователь может выбрать несколько параметров, чтобы отфильтровать таблицу и отобразить результаты.В настоящее время это включено в мой метод onget путем создания строки в URL-адресе и последующего запуска запросов linq для отображения результатов на основе выбора пользователя.Это работает, но мне кажется очень неэффективным передавать такой длинный URL.Разве нет лучшего способа сделать это с помощью привязки модели?

.cshtml файл:

<select multiple class="form-control" name="CurSelDepts" asp-items="Model.DeptList" asp-for="SelDepts"></select>
<select multiple class="form-control" name="CurSelTechs" asp-items="Model.TechOneList" asp-for="SelTechs"></select>
<select multiple class="form-control" name="CurSelTech2s" asp-items="Model.TechTwoList" asp-for="SelTech2s"></select>
<select multiple class="form-control" name="CurSelRoles" asp-items="Model.RoleList" asp-for="SelRoles"></select>
<select class="form-control col-md-6" name="CurSelEmp" asp-items="Model.EmployeeList" asp-for="SelEmp">
    <option disabled selected style="display:none">--select--</option>
</select>
<input formmethod="get" type="submit" value="Search" class="btn btn-primary btn-sm" id="searchbtn" />

.cs файл:

public MultiSelectList DeptList { get; set; }
public MultiSelectList TechOneList { get; set; }
public MultiSelectList TechTwoList { get; set; }
public SelectList EmployeeList { get; set; }
public MultiSelectList RoleList { get; set; }
public int SelEmp { get; set; }
public int SelNewEmp { get; set; }
public int[] SelRoles { get; set; }
public int[] SelDepts { get; set; }
public int[] SelTechs { get; set; }
public int[] SelTech2s { get; set; }

public async Task OnGetAsync(int[] selRoles, int[] curSelRoles, int selEmp, int curSelEmp, int[] selDepts, int[] curSelDepts, int[] selTechs, int[] curSelTechs, int[] selTech2s, int[] curSelTech2s)
{
    DeptList = new MultiSelectList(_context.ppcc_deptCds, "Id", "dept_cd", SelDepts);
    TechOneList = new MultiSelectList(_context.ppcc_techCds, "Id", "tech_cd", SelTechs);
    TechTwoList = new MultiSelectList(_context.ppcc_techTwoCds, "Id", "tech_cd_two", SelTech2s);
    RoleList = new MultiSelectList(_context.ppcc_roles, "Id", "role_nm", SelRoles);
    EmployeeList = new SelectList(_context.employees, "Id", "employee_nm", SelEmp);

    SelEmp = curSelEmp;
    SelDepts = curSelDepts;
    SelTechs = curSelTechs;
    SelTech2s = curSelTech2s;
    SelRoles = curSelRoles;

    IQueryable<ppcc_matrix> ppcc_matrixIQ = from s in _context.ppcc_matrices select s;

    if (curSelDepts.Any())  {ppcc_matrixIQ = ppcc_matrixIQ.Where(s => curSelDepts.Contains(s.ppcc_deptCdId));}
    if (curSelTechs.Any())  {ppcc_matrixIQ = ppcc_matrixIQ.Where(s => curSelTechs.Contains(s.ppcc_techCdId));}
    if (curSelTech2s.Any()) {ppcc_matrixIQ = ppcc_matrixIQ.Where(s => curSelTech2s.Contains(s.ppcc_techTwoCdId));}
    if (curSelRoles.Any())  {ppcc_matrixIQ = ppcc_matrixIQ.Where(s => curSelRoles.Contains(s.ppcc_roleId));}
    if (curSelEmp != 0) { ppcc_matrixIQ = ppcc_matrixIQ.Where(s => s.employeeId.Equals(curSelEmp)); }
}

1 Ответ

1 голос
/ 05 июня 2019

Связывание моделей работает как с запросами GET, так и с запросами POST.Вам просто нужно убедиться, что открытые свойства украшены атрибутом BindProperty с SupportsGet = true (https://www.learnrazorpages.com/razor-pages/model-binding#binding-data-from-get-requests):

[BindProperty(SupportsGet=true)]
public Type MyProperty { get; set; }

Что касается очень длинных URL, существует ограничение на длиныGET-запроса . POST-запросы также имеют ограничения, налагаемые серверами, но по умолчанию они намного больше. Это необходимо для обслуживания загрузки файлов, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...