Form
возвращает формат URL: localhost2343/index?Colors=red&Colors=blue&Colors=pink
asp-route
формат возврата: localhost2343/index?Colors=red,blue,pink
Если я использую кнопку отправки form
, все кажется хорошим. Но если я нажму на гиперссылку sort
, она передаст URL-адрес Colors=System.String%5B%5D
Как я могу передать значение цветов внутри asp-маршрута?
<form asp-page = "./index" method = "get">
<select asp-for = "Colors" asp-items = "@Model.Colors_SELECT" class = "MultiSelect" multiple>
<option value = "">All</option>
</select>
...
</form>
<Table>
...
<a asp-page = "./Index" method = "get"
asp-route-SortOrder = "@Model.Colors_Sort"
asp-route-SearchString = "@Model.SearchString"
asp-route-Colors = "@Model.Colors">
@Html.DisplayNameFor(model =>
model.MyList[0].Colors)
</a>
...
</table>
[BindProperty(SupportsGet = true)]
public string[]? Colors { get; set; }
public SelectList? Colors_SELECT { get; set; }
public async Task OnGetAsync()
{
// Form - URL Format
// get values from URL & set inside selectlist
var result = Request.Query["Colors"];
var i = 0;
foreach (string? item in result) {
Colors[i] = item;
i++;
}
}
Обновление - я пробовал это, но по ссылке sort
он удаляет переменную сортировки и выбирает только 1 цвет (не несколько)
<a asp-page = "./Index" method = "get"
asp-route-SortOrder = "@Model.Colors_Sort"
asp-all-route-data = "@Model.routeData">
[BindProperty(SupportsGet = true)]
public Dictionary<string, string> routeData { get; set; }
....
var routeData = new Dictionary<string, string>();
routeData.Add("SortOrder", CurrentSort);
routeData.Add("SearchString", SearchString);
for (int i = 0; i < result.Count; i++)
{
var myParam = result[i];
routeData.Add($"Colors{i}", myParam.ToString());
}
form
возвращает URL без общих и asp-route
возвращает URL с общими. просто запутался, почему это так и как выбрать один формат
ИМХО передайте RouteData.Values
в asp-all-route-data
, чтобы вам не приходилось перечислять каждое значение отдельно.
@JeremyLakeman Спасибо, я только что искал, как использовать asp-all-route-data
, но я думаю, что теперь он удаляет все переменные URL. я пропустил какой-то код
Это может помочь:
Чтобы получить выбранные значения из элемента выбора на странице Razor, вы можете использовать коллекцию Request.Form["selectName"]
.
Например, рассмотрим следующий элемент select
:
@page "{Colors}"
<form method = "post">
<select multiple name = "colors">
<option value = "red">Red</option>
<option value = "blue">Blue</option>
<option value = "pink">Pink</option>
</select>
<button type = "submit" asp-page-handler = "GetColors">Submit</button>
</form>
Чтобы получить выбранные значения в обработчике отправки формы и изменить строку запроса в URL-адресе и включить выбранные значения (красный, синий, розовый), вы можете попробовать следующий код:
public IActionResult OnGet(string? Colors)
{
if (string.IsNullOrWhiteSpace(Colors))
{
// do something
return Page();
}
if (!string.IsNullOrWhiteSpace(Colors))
{
// Do something
return Page();
}
return Page();
}
public IActionResult OnPostGetColors()
{
IDictionary<string, string> params = new Dictionary<string, string>();
var selectedColors = string.Join(",", Request.Form["colors"]);
params.Add("Colors", selectedColors);
string query = "";
foreach (var p in params)
query += $"{p.Key} = {p.Value}";
var url = $"{HttpContext.Request.Path}?{query}";
return Redirect(url); // url : https://localhost:7272/index?Colors=red,blue,pink
}
Этот код поможет вам отправить выбранные значения через URL-адрес в виде строки запроса, а затем перенаправит пользователя на новый URL-адрес с добавлением выбранных значений в строку запроса в виде нескольких значений для параметра цветов.
умное решение, я не догадался сделать в OnPost
Извините за беспокойство. У меня просто есть быстрое дополнение к проблеме, может быть, вы можете помочь. если нет не беспокойтесь. спасибо, https://stackoverflow.com/questions/75061161/how-to-select-values-inside-list
Почему вместо этого вы хотите использовать список, разделенный запятыми?