如何使用组合框更改排序顺序?
How do I use a combo-box to change the sort order?
在我看来,我有一个用户上传的集合,我添加了一个带有操作链接的组合框以将视图刷新为 select 新的排序顺序:
@model IEnumerable<FunPetPics.Models.PetPhotoModel>
@{
ViewData["Title"] = "Index";
}
<p>
<a asp-action="UploadPhoto">Upload Photo</a>
</p>
@if (Model == null || !Model.Any())
{
<p>Your uploads will be displayed here</p>
}
else
{
<div class="row">
<div class="col-md-4">
<h6>Order by:</h6>
<div class="form-group">
<input type=text list=sortOrder class="list">
<datalist id=sortOrder>
<option>@Html.ActionLink("Newest", "Index", new { sortOrder = "Newest" })</option>
<option>@Html.ActionLink("Oldest", "Index", new { sortOrder = "Oldest" })</option>
<option>@Html.ActionLink("Cutest", "Index", new { sortOrder = "Cutest" })</option>
<option>@Html.ActionLink("Funiest", "Index", new { sortOrder = "Funiest" })</option>
<option>@Html.ActionLink("Most Awsome", "Index", new { sortOrder = "Most Awsome" })</option>
</datalist>
</div>
</div>
</div>
<br />
<div class="card-columns">
@foreach (var upload in Model)
{
<div class="card">
<img class="card-img-top" src="@("~/UploadedPhotos/"+ upload.ImageName)" asp-append-version="true">
<div class="card-body">
<h4 class="card-title">@upload.Title</h4>
<h6 class="card-subtitle mb-2 text-muted">@upload.PetName</h6>
<p class="card-text">@upload.DateUploaded</p>
<p class="card-text">@upload.Description</p>
<p class="card-subtitle">Ratings:</p>
<p class="card-text">
Cute:@upload.AverageCutenessRating/5<br />
Funny:@upload.AverageFunnynessRating/5<br />
Awsome:@upload.AverageAwsomnessRating/5<br />
</p>
</div>
</div>
}
</div>
}
在我的控制器中,我使用 switch 语句获取用户的上传列表,该语句根据 sortOrder
参数更改顺序,然后 return 带有模型的视图:
public IActionResult Index(string sortOrder)
{
//get the current logged in user and their collection of uploads from the database context
var uploads = GetLoggedInUser().Uploads;
if (uploads == null || !uploads.Any())
{
return View();
}
switch (sortOrder)
{
case "Newest":
uploads.OrderByDescending(u => u.DateUploaded);
break;
case "Oldest":
uploads.OrderBy(u => u.DateUploaded);
break;
case "Cutest":
uploads.OrderByDescending(u => u.AverageCutenessRating)
.ThenByDescending(u => u.DateUploaded);
break;
case "Funniest":
uploads.OrderByDescending(u => u.AverageFunnynessRating)
.ThenByDescending(u => u.DateUploaded);
break;
case "Most Awsome":
uploads.OrderByDescending(u => u.AverageAwsomnessRating)
.ThenByDescending(u => u.DateUploaded);
break;
default:
sortOrder = "Newest";
uploads.OrderByDescending(u => u.DateUploaded);
break;
}
return View(uploads.ToList());
}
第一个问题:从菜单中选择一个项目并没有点击超链接,它只是从列表中删除其他项目
第二个问题:当尝试使用 URL 中的 localhost:44316/UserUploads?sortOrder="Oldest"
手动导航并刷新页面时,控制器中的 sortOrder
为空,因此顺序不会改变
Selecting an item from the menu does not click in the hyperlink
datalist
不支持表单或链接。他们只是为输入提供一个下拉列表。所以这里的ActionLink是不起作用的,你应该用js或者jquery刷新页面。
it just removes other items from the list
实际上,它们并没有被删除。 datalist 有一个内置的 autocomplete
属性,所以在你 select 输入一个选项之后,其他的都是不可见的。您需要先清除输入。
When trying to navigate manually using localhost:44316/UserUploads?sortOrder="Oldest" in the URL and refresh the page the sortOrder in the controller is null so the order does not change
不需要在查询字符串中添加双引号。
localhost:44316/UserUploads?sortOrder=Oldest
我根据你的需要做了一个demo,你可以参考一下。
Index.cshtml:
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="UploadPhoto">Upload Photo</a>
</p>
<div class="row">
<div class="col-md-4">
<h6>Order by:</h6>
<div class="form-group">
<input type="text" id="sortOrder" name="sortOrder" list="orderList" value="@ViewBag.sortOrder">
<datalist id="orderList">
<option>@Html.ActionLink("Newest", "Index", new { sortOrder = "Newest" })</option>
<option>@Html.ActionLink("Oldest", "Index", new { sortOrder = "Oldest" })</option>
<option>@Html.ActionLink("Cutest", "Index", new { sortOrder = "Cutest" })</option>
<option>@Html.ActionLink("Funiest", "Index", new { sortOrder = "Funiest" })</option>
<option>@Html.ActionLink("Most Awsome", "Index", new { sortOrder = "Most Awsome" })</option>
</datalist>
</div>
</div>
</div>
<br />
@section scripts{
<script>
$("#sortOrder").bind('input', function () {
if (checkExists($('#sortOrder').val()) === true) {
var url = '@Url.Action("Index", "UserUploads")';
var text = $('#sortOrder').val();
switch (text) {
case "Newest":
url = url +"?sortOrder=Newest";
break;
case "Oldest":
url = url +"?sortOrder=Oldest";
break;
case "Cutest":
url = url +"?sortOrder=Cutest";
break;
case "Funiest":
url = url +"?sortOrder=Funiest";
break;
case "Most Awsome":
url = url +"?sortOrder=Most Awsome";
break;
default:
url = '@Url.Action("Index")';
}
window.location = url;
}
});
function checkExists(inputValue) {
console.log(inputValue);
var x = document.getElementById("orderList");
var i;
var flag;
for (i = 0; i < x.options.length; i++) {
if (inputValue == x.options[i].value) {
flag = true;
}
}
return flag;
}
</script>
}
控制器:
public class UserUploadsController : Controller
{
public IActionResult Index(string sortOrder)
{
ViewBag.sortOrder = sortOrder;
return View();
}
}
结果:
在我看来,我有一个用户上传的集合,我添加了一个带有操作链接的组合框以将视图刷新为 select 新的排序顺序:
@model IEnumerable<FunPetPics.Models.PetPhotoModel>
@{
ViewData["Title"] = "Index";
}
<p>
<a asp-action="UploadPhoto">Upload Photo</a>
</p>
@if (Model == null || !Model.Any())
{
<p>Your uploads will be displayed here</p>
}
else
{
<div class="row">
<div class="col-md-4">
<h6>Order by:</h6>
<div class="form-group">
<input type=text list=sortOrder class="list">
<datalist id=sortOrder>
<option>@Html.ActionLink("Newest", "Index", new { sortOrder = "Newest" })</option>
<option>@Html.ActionLink("Oldest", "Index", new { sortOrder = "Oldest" })</option>
<option>@Html.ActionLink("Cutest", "Index", new { sortOrder = "Cutest" })</option>
<option>@Html.ActionLink("Funiest", "Index", new { sortOrder = "Funiest" })</option>
<option>@Html.ActionLink("Most Awsome", "Index", new { sortOrder = "Most Awsome" })</option>
</datalist>
</div>
</div>
</div>
<br />
<div class="card-columns">
@foreach (var upload in Model)
{
<div class="card">
<img class="card-img-top" src="@("~/UploadedPhotos/"+ upload.ImageName)" asp-append-version="true">
<div class="card-body">
<h4 class="card-title">@upload.Title</h4>
<h6 class="card-subtitle mb-2 text-muted">@upload.PetName</h6>
<p class="card-text">@upload.DateUploaded</p>
<p class="card-text">@upload.Description</p>
<p class="card-subtitle">Ratings:</p>
<p class="card-text">
Cute:@upload.AverageCutenessRating/5<br />
Funny:@upload.AverageFunnynessRating/5<br />
Awsome:@upload.AverageAwsomnessRating/5<br />
</p>
</div>
</div>
}
</div>
}
在我的控制器中,我使用 switch 语句获取用户的上传列表,该语句根据 sortOrder
参数更改顺序,然后 return 带有模型的视图:
public IActionResult Index(string sortOrder)
{
//get the current logged in user and their collection of uploads from the database context
var uploads = GetLoggedInUser().Uploads;
if (uploads == null || !uploads.Any())
{
return View();
}
switch (sortOrder)
{
case "Newest":
uploads.OrderByDescending(u => u.DateUploaded);
break;
case "Oldest":
uploads.OrderBy(u => u.DateUploaded);
break;
case "Cutest":
uploads.OrderByDescending(u => u.AverageCutenessRating)
.ThenByDescending(u => u.DateUploaded);
break;
case "Funniest":
uploads.OrderByDescending(u => u.AverageFunnynessRating)
.ThenByDescending(u => u.DateUploaded);
break;
case "Most Awsome":
uploads.OrderByDescending(u => u.AverageAwsomnessRating)
.ThenByDescending(u => u.DateUploaded);
break;
default:
sortOrder = "Newest";
uploads.OrderByDescending(u => u.DateUploaded);
break;
}
return View(uploads.ToList());
}
第一个问题:从菜单中选择一个项目并没有点击超链接,它只是从列表中删除其他项目
第二个问题:当尝试使用 URL 中的 localhost:44316/UserUploads?sortOrder="Oldest"
手动导航并刷新页面时,控制器中的 sortOrder
为空,因此顺序不会改变
Selecting an item from the menu does not click in the hyperlink
datalist
不支持表单或链接。他们只是为输入提供一个下拉列表。所以这里的ActionLink是不起作用的,你应该用js或者jquery刷新页面。
it just removes other items from the list
实际上,它们并没有被删除。 datalist 有一个内置的 autocomplete
属性,所以在你 select 输入一个选项之后,其他的都是不可见的。您需要先清除输入。
When trying to navigate manually using localhost:44316/UserUploads?sortOrder="Oldest" in the URL and refresh the page the sortOrder in the controller is null so the order does not change
不需要在查询字符串中添加双引号。
localhost:44316/UserUploads?sortOrder=Oldest
我根据你的需要做了一个demo,你可以参考一下。
Index.cshtml:
@{
ViewData["Title"] = "Index";
}
<h1>Index</h1>
<p>
<a asp-action="UploadPhoto">Upload Photo</a>
</p>
<div class="row">
<div class="col-md-4">
<h6>Order by:</h6>
<div class="form-group">
<input type="text" id="sortOrder" name="sortOrder" list="orderList" value="@ViewBag.sortOrder">
<datalist id="orderList">
<option>@Html.ActionLink("Newest", "Index", new { sortOrder = "Newest" })</option>
<option>@Html.ActionLink("Oldest", "Index", new { sortOrder = "Oldest" })</option>
<option>@Html.ActionLink("Cutest", "Index", new { sortOrder = "Cutest" })</option>
<option>@Html.ActionLink("Funiest", "Index", new { sortOrder = "Funiest" })</option>
<option>@Html.ActionLink("Most Awsome", "Index", new { sortOrder = "Most Awsome" })</option>
</datalist>
</div>
</div>
</div>
<br />
@section scripts{
<script>
$("#sortOrder").bind('input', function () {
if (checkExists($('#sortOrder').val()) === true) {
var url = '@Url.Action("Index", "UserUploads")';
var text = $('#sortOrder').val();
switch (text) {
case "Newest":
url = url +"?sortOrder=Newest";
break;
case "Oldest":
url = url +"?sortOrder=Oldest";
break;
case "Cutest":
url = url +"?sortOrder=Cutest";
break;
case "Funiest":
url = url +"?sortOrder=Funiest";
break;
case "Most Awsome":
url = url +"?sortOrder=Most Awsome";
break;
default:
url = '@Url.Action("Index")';
}
window.location = url;
}
});
function checkExists(inputValue) {
console.log(inputValue);
var x = document.getElementById("orderList");
var i;
var flag;
for (i = 0; i < x.options.length; i++) {
if (inputValue == x.options[i].value) {
flag = true;
}
}
return flag;
}
</script>
}
控制器:
public class UserUploadsController : Controller
{
public IActionResult Index(string sortOrder)
{
ViewBag.sortOrder = sortOrder;
return View();
}
}
结果: