C# 如何使用Ajax在Asp.net核心MVC中刷新数据而不重新加载页面?
我使用复选框进行数据过滤。我希望当我点击提交按钮时,只更新产品而不重新加载页面 以下是过滤:C# 如何使用Ajax在Asp.net核心MVC中刷新数据而不重新加载页面?,c#,ajax,asp.net-mvc,asp.net-core,C#,Ajax,Asp.net Mvc,Asp.net Core,我使用复选框进行数据过滤。我希望当我点击提交按钮时,只更新产品而不重新加载页面 以下是过滤: <form id="my_form" asp-action="Face" method="get"> <label>Color:</label> <input type="checkbox" name="color" value="bla
<form id="my_form" asp-action="Face" method="get">
<label>Color:</label>
<input type="checkbox" name="color" value="black" /><span>Black</span>
<input type="checkbox" name="color" value="white" /><span>White</span>
<br />
<p></p>
<label>Manufacturer:</label>
<input type="checkbox" name="brand" value="A" /><span>A</span>
<input type="checkbox" name="brand" value="B" /><span>B</span>
<input class="btn btn-info float-right" type="submit" value="Search" />
//Etc
</form>
我需要先显示这些数据。在传递过滤器的情况下,它们会根据我传递给控制器的内容进行更新
<div class="row pr-3 pl-3">
@foreach (var c in Model)
{
<div class="filter col-md-3 p-0 hover-bc-card" data-category="@c.PurposeFor">
<div class="p-3">
<a class="text-decoration-none text-dark" asp-action="Product" asp-controller="Cosmetic" asp-route-id="@c.Id">
<div>
<img class="card-img-top p-4 bg-white" src=@c.Img alt="@c.Name">
</div>
</a>
<div class="card-body">
<h5 class="card-title text-center">@c.Name</h5>
<p class="card-text text-center f-sz-12 ">@c.PurposeFor</p>
<p class="card-text rounded text-center price-for-list">@c.Price ₴</p>
</div>
</div>
</div>
}
</div>
以防我的控制器:
public IActionResult Face(string[] color, string[] brand, string[] PurposeFor, string sortOrder)
{
ViewBag.color = color;
ViewBag.PurposeFor = PurposeFor;
ViewBag.brand = brand;
ViewBag.NameSortParm = string.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.PriceSortParm = sortOrder == "Price" ? "Price_desc" : "Price";
var cosmetics = db.Cosmetics.Where(c => c.PurposeFor.Contains("Face")).ToList();
var co_cars = new List<Cosmetic>();
var ma_cars = new List<Cosmetic>();
var purposeFor = new List<Cosmetic>();
if (color.Length != 0)
{
foreach (string co in color)
{
var colorfiltercars = db.Cosmetics.Where(c => c.Color.Contains(co)).ToList();
co_cars.AddRange(colorfiltercars);
}
}
else
{
co_cars = cosmetics;
}
if (PurposeFor.Length != 0)
{
foreach (string pf in PurposeFor)
{
var purposefiltercars = db.Cosmetics.Where(c => c.PurposeFor.Contains(pf)).ToList();
purposeFor.AddRange(purposefiltercars);
}
}
else
{
purposeFor = cosmetics;
}
if (brand.Length != 0)
{
foreach (string ma in brand)
{
var manufacturerfiltercars = db.Cosmetics.Where(c => c.Brand.Contains(ma)).ToList();
ma_cars.AddRange(manufacturerfiltercars);
}
}
else
{
ma_cars = cosmetics;
}
var filtercars = co_cars.Intersect(ma_cars);
filtercars = filtercars.Intersect(purposeFor);
switch (sortOrder)
{
case "Name_desc":
filtercars = filtercars.OrderByDescending(s => s.Name);
break;
case "Price":
filtercars = filtercars.OrderBy(s => s.Price);
break;
case "Price_desc":
filtercars = filtercars.OrderByDescending(s => s.Price);
break;
default:
filtercars = filtercars.OrderBy(s => s.Name);
break;
}
return View(filtercars.ToList());
}
public JsonResult AjaxMethodeCheckMe(int id)
{
List<SelectListItem> ListOfPort = new List<SelectListItem>();
ListOfPort.Add(new SelectListItem() { Text = "Text 1", Value = "Value1" });
ListOfPort.Add(new SelectListItem() { Text = "Text 2", Value = "Value2" });
ListOfPort.Add(new SelectListItem() { Text = "Text 3", Value = "Value3" });
return Json(new SelectList(ListOfPort, "Value", "Text"));
}
如果要避免重新加载页面,我建议您执行以下步骤: 1-JQuery和Ajax Post将数据发送到控制器
<div class="row pr-3 pl-3">
@foreach (var c in Model)
{
<div class="filter col-md-3 p-0 hover-bc-card" data-category="@c.PurposeFor">
<div class="p-3">
<a class="text-decoration-none text-dark" asp-action="Product" asp-controller="Cosmetic" asp-route-id="@c.Id">
<div>
<img class="card-img-top p-4 bg-white" src=@c.Img alt="@c.Name">
</div>
</a>
<div class="card-body">
<h5 class="card-title text-center">@c.Name</h5>
<p class="card-text text-center f-sz-12 ">@c.PurposeFor</p>
<p class="card-text rounded text-center price-for-list">@c.Price ₴</p>
</div>
</div>
</div>
}
</div>
2-控制器中的功能用于管理数据并发送包含所需数据的响应
3-在Ajax的成功部分。清除或。附加相关HTML部分,如div或select选项
这里有一个小例子可以指导您,但您必须根据自己的需要进行调整:
在CSHTML中:不要忘记在复选框中添加Id:
<button type="button" onclick="checkMe()">Search</button>
<input type="checkbox" id="Checkbox1" />
<input type="checkbox" id="Checkbox2" />
<script>
function checkMe() {
// here get value of your checkbox1
var Checkbox1state = $('#Checkbox1').prop('checked');
var Checkbox2state = $('#Checkbox2').prop('checked');
// and some logic how you want to filter if there is many parameter
var id =0
if (Checkbox2state) { id=1 } else { id=2 };
$.ajax({
type: "POST",
url: "/Home/AjaxMethodeCheckMe",
data: '{id: "' + id + '" }',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (ListOfItems) {
$("#yourDropDown").empty();
$.each(ListOfItems, function (i, item) {
$("#yourDropDown").append('<option value="' + item.Value + '">' + item.Text + '</option>');
});
},
failure: function (response) {
alert("failure");
},
error: function (response) {
alert("error");
},
});
}
</script>
在控制器中:
public IActionResult Face(string[] color, string[] brand, string[] PurposeFor, string sortOrder)
{
ViewBag.color = color;
ViewBag.PurposeFor = PurposeFor;
ViewBag.brand = brand;
ViewBag.NameSortParm = string.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.PriceSortParm = sortOrder == "Price" ? "Price_desc" : "Price";
var cosmetics = db.Cosmetics.Where(c => c.PurposeFor.Contains("Face")).ToList();
var co_cars = new List<Cosmetic>();
var ma_cars = new List<Cosmetic>();
var purposeFor = new List<Cosmetic>();
if (color.Length != 0)
{
foreach (string co in color)
{
var colorfiltercars = db.Cosmetics.Where(c => c.Color.Contains(co)).ToList();
co_cars.AddRange(colorfiltercars);
}
}
else
{
co_cars = cosmetics;
}
if (PurposeFor.Length != 0)
{
foreach (string pf in PurposeFor)
{
var purposefiltercars = db.Cosmetics.Where(c => c.PurposeFor.Contains(pf)).ToList();
purposeFor.AddRange(purposefiltercars);
}
}
else
{
purposeFor = cosmetics;
}
if (brand.Length != 0)
{
foreach (string ma in brand)
{
var manufacturerfiltercars = db.Cosmetics.Where(c => c.Brand.Contains(ma)).ToList();
ma_cars.AddRange(manufacturerfiltercars);
}
}
else
{
ma_cars = cosmetics;
}
var filtercars = co_cars.Intersect(ma_cars);
filtercars = filtercars.Intersect(purposeFor);
switch (sortOrder)
{
case "Name_desc":
filtercars = filtercars.OrderByDescending(s => s.Name);
break;
case "Price":
filtercars = filtercars.OrderBy(s => s.Price);
break;
case "Price_desc":
filtercars = filtercars.OrderByDescending(s => s.Price);
break;
default:
filtercars = filtercars.OrderBy(s => s.Name);
break;
}
return View(filtercars.ToList());
}
public JsonResult AjaxMethodeCheckMe(int id)
{
List<SelectListItem> ListOfPort = new List<SelectListItem>();
ListOfPort.Add(new SelectListItem() { Text = "Text 1", Value = "Value1" });
ListOfPort.Add(new SelectListItem() { Text = "Text 2", Value = "Value2" });
ListOfPort.Add(new SelectListItem() { Text = "Text 3", Value = "Value3" });
return Json(new SelectList(ListOfPort, "Value", "Text"));
}
这里我展示了如何使用下拉菜单,但您可以修改…如果您希望避免重新加载页面,我建议您执行以下步骤: 1-JQuery和Ajax Post将数据发送到控制器
<div class="row pr-3 pl-3">
@foreach (var c in Model)
{
<div class="filter col-md-3 p-0 hover-bc-card" data-category="@c.PurposeFor">
<div class="p-3">
<a class="text-decoration-none text-dark" asp-action="Product" asp-controller="Cosmetic" asp-route-id="@c.Id">
<div>
<img class="card-img-top p-4 bg-white" src=@c.Img alt="@c.Name">
</div>
</a>
<div class="card-body">
<h5 class="card-title text-center">@c.Name</h5>
<p class="card-text text-center f-sz-12 ">@c.PurposeFor</p>
<p class="card-text rounded text-center price-for-list">@c.Price ₴</p>
</div>
</div>
</div>
}
</div>
2-控制器中的功能用于管理数据并发送包含所需数据的响应
3-在Ajax的成功部分。清除或。附加相关HTML部分,如div或select选项
这里有一个小例子可以指导您,但您必须根据自己的需要进行调整:
在CSHTML中:不要忘记在复选框中添加Id:
<button type="button" onclick="checkMe()">Search</button>
<input type="checkbox" id="Checkbox1" />
<input type="checkbox" id="Checkbox2" />
<script>
function checkMe() {
// here get value of your checkbox1
var Checkbox1state = $('#Checkbox1').prop('checked');
var Checkbox2state = $('#Checkbox2').prop('checked');
// and some logic how you want to filter if there is many parameter
var id =0
if (Checkbox2state) { id=1 } else { id=2 };
$.ajax({
type: "POST",
url: "/Home/AjaxMethodeCheckMe",
data: '{id: "' + id + '" }',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (ListOfItems) {
$("#yourDropDown").empty();
$.each(ListOfItems, function (i, item) {
$("#yourDropDown").append('<option value="' + item.Value + '">' + item.Text + '</option>');
});
},
failure: function (response) {
alert("failure");
},
error: function (response) {
alert("error");
},
});
}
</script>
在控制器中:
public IActionResult Face(string[] color, string[] brand, string[] PurposeFor, string sortOrder)
{
ViewBag.color = color;
ViewBag.PurposeFor = PurposeFor;
ViewBag.brand = brand;
ViewBag.NameSortParm = string.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.PriceSortParm = sortOrder == "Price" ? "Price_desc" : "Price";
var cosmetics = db.Cosmetics.Where(c => c.PurposeFor.Contains("Face")).ToList();
var co_cars = new List<Cosmetic>();
var ma_cars = new List<Cosmetic>();
var purposeFor = new List<Cosmetic>();
if (color.Length != 0)
{
foreach (string co in color)
{
var colorfiltercars = db.Cosmetics.Where(c => c.Color.Contains(co)).ToList();
co_cars.AddRange(colorfiltercars);
}
}
else
{
co_cars = cosmetics;
}
if (PurposeFor.Length != 0)
{
foreach (string pf in PurposeFor)
{
var purposefiltercars = db.Cosmetics.Where(c => c.PurposeFor.Contains(pf)).ToList();
purposeFor.AddRange(purposefiltercars);
}
}
else
{
purposeFor = cosmetics;
}
if (brand.Length != 0)
{
foreach (string ma in brand)
{
var manufacturerfiltercars = db.Cosmetics.Where(c => c.Brand.Contains(ma)).ToList();
ma_cars.AddRange(manufacturerfiltercars);
}
}
else
{
ma_cars = cosmetics;
}
var filtercars = co_cars.Intersect(ma_cars);
filtercars = filtercars.Intersect(purposeFor);
switch (sortOrder)
{
case "Name_desc":
filtercars = filtercars.OrderByDescending(s => s.Name);
break;
case "Price":
filtercars = filtercars.OrderBy(s => s.Price);
break;
case "Price_desc":
filtercars = filtercars.OrderByDescending(s => s.Price);
break;
default:
filtercars = filtercars.OrderBy(s => s.Name);
break;
}
return View(filtercars.ToList());
}
public JsonResult AjaxMethodeCheckMe(int id)
{
List<SelectListItem> ListOfPort = new List<SelectListItem>();
ListOfPort.Add(new SelectListItem() { Text = "Text 1", Value = "Value1" });
ListOfPort.Add(new SelectListItem() { Text = "Text 2", Value = "Value2" });
ListOfPort.Add(new SelectListItem() { Text = "Text 3", Value = "Value3" });
return Json(new SelectList(ListOfPort, "Value", "Text"));
}
这里我展示了如何使用下拉菜单,但您可以修改
我希望当我点击提交按钮时,只更新产品而不重新加载页面
您可以参考下面的代码片段,使用返回的部分视图结果动态更新目标容器
<form id="my_form" asp-action="Face" method="get" data-ajax="true" data-ajax-method="get" data-ajax-update="#panel" data-ajax-mode='replace' data-ajax-url="@Url.Action("GetPartial","Home")">
<label>Color:</label>
<input type="checkbox" name="color" value="black" /><span>Black</span>
<input type="checkbox" name="color" value="white" /><span>White</span>
<br />
<p></p>
<label>Manufacturer:</label>
<input type="checkbox" name="brand" value="A" /><span>A</span>
<input type="checkbox" name="brand" value="B" /><span>B</span>
<input class="btn btn-info float-right" type="submit" value="Search" />
</form>
返回局部视图的操作方法
局部视图_CarListPartial.cshtml
测试结果
我希望当我点击提交按钮时,只更新产品而不重新加载页面
您可以参考下面的代码片段,使用返回的部分视图结果动态更新目标容器
<form id="my_form" asp-action="Face" method="get" data-ajax="true" data-ajax-method="get" data-ajax-update="#panel" data-ajax-mode='replace' data-ajax-url="@Url.Action("GetPartial","Home")">
<label>Color:</label>
<input type="checkbox" name="color" value="black" /><span>Black</span>
<input type="checkbox" name="color" value="white" /><span>White</span>
<br />
<p></p>
<label>Manufacturer:</label>
<input type="checkbox" name="brand" value="A" /><span>A</span>
<input type="checkbox" name="brand" value="B" /><span>B</span>
<input class="btn btn-info float-right" type="submit" value="Search" />
</form>
返回局部视图的操作方法
局部视图_CarListPartial.cshtml
测试结果
在调用ajax时,您面临的具体问题是什么?我知道如何调用ajax,但不知道如何在mvc中使用它。我可以使用ajax和html创建一个调用按钮,但我找不到如何将所有这些与mvc结合起来。更准确地说,我找到了如何在mvc中使用它。但是这对我的问题没有帮助。在调用ajax时,您面临的具体问题是什么?我知道如何调用ajax,但不知道如何在mvc中使用它。我可以使用ajax和html创建一个调用按钮,但我找不到如何将所有这些与mvc结合起来。更准确地说,我找到了如何在mvc中使用它。但这对我的问题没有帮助,您也可以使用jqueryajax通过在Ajax成功回调函数的目标div容器中加载返回的部分视图结果来实现同样的效果。但是我确实需要将请求传递给查询字符串。因此,我可以复制链接并使用过滤器发送给其他人appliedI肯定需要将请求传递给查询字符串。因此,我可以复制链接并发送给其他人,并应用过滤器Hi@Betsq9,以实现此要求,正如我在评论中提到的,您可以通过将jQuery Ajax设置为GetPartial action来实现同样的目的,然后将返回的部分视图结果加载/附加到目标div容器中。此外,如果您在F12开发者工具网络选项卡中检查实际请求,您会发现上面使用jQuery Unobtrusive AJAX的代码也通过查询字符串传递数据。您也可以使用jQuery AJAX通过在AJAX成功回调函数中将返回的部分视图结果加载到目标div容器中来实现同样的目的。这看起来就像我需要的一样。但是我确实需要将请求传递给查询字符串。因此,我可以复制链接并使用过滤器发送给其他人appliedI肯定需要将请求传递给查询字符串。因此,我可以复制链接并发送给其他人,并应用过滤器Hi@Betsq9,以实现此要求,正如我在评论中提到的,您可以通过将jQuery Ajax设置为GetPartial action来实现同样的目的,然后将返回的部分视图结果加载/附加到目标div容器中。此外,如果您在F12开发者工具网络选项卡中检查实际请求,您会发现,上面使用jQuery unobtrusiveajax的代码也通过查询字符串传递数据。