在局部视图调用 ajax 后尝试更改文本框
Trying to change a textbox after an ajax call from a partial view
在部分视图中更改“性别”下拉列表后,我试图将“姓名”文本框颜色更改为(如果是男性则为蓝色,如果是女性则为粉红色)。
索引视图:
@{
ViewData["Title"] = "Home Page";
var gender = ViewBag.Gender; //breakpoint
}
@if (gender == "Male")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightblue" />
</div>
}
else if (gender == "Female")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightpink" />
</div>
}
else
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: white" />
</div>
}
<div id="gender">
<partial name="_GenderDropdown" model="Model" />
</div>
局部视图:
<label>Gender</label>
<select id="genderstring">
<option value="">Select Gender</option>
<option value="Male">Male</option>
<option value="Female">Female</option>
</select>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
//ajax for posting gender to controller
$('#genderstring').on('change', function () {
$.ajax({
url: '@Url.Action("Index", "Home")',
type: 'GET',
data: { gender: $("#genderstring").val() },
success: function () {
},
error: function () {
}
});
});
});
</script>
控制器:
public IActionResult Index(string gender)
{
if(gender == null)
{
return View(new User { Name = "", Gender = "" });
}
else
{
ViewBag.Gender = gender;
return View("Index"); //breakpoint
}
}
通过这 2 个断点,我可以看到数据正在传递,但在我更改性别后,它会进入 viewbag 中带有性别的视图,但页面的其余部分不会 运行。
当你使用ajax时,后台代码完成后不会重新加载你的页面 default.More 详细解释和解决方案你可以查看如下:
第一种方式
您可以使用 .html()
方法在 ajax 成功后将后端结果渲染到 html:
1.View(一定要加一个div来包含整个html):
<div id="result"> //add the div......
@if (gender == "Male")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightblue" />
</div>
}
else if (gender == "Female")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightpink" />
</div>
}
else
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: white" />
</div>
}
<div id="gender">
<partial name="_GenderDropdown" model="Model" />
</div>
</div>
2.Js 局部视图:
<script>
$(document).ready(function () {
$('#genderstring').on('change', function () {
$.ajax({
url: '@Url.Action("Index", "Home")',
type: 'GET',
data: { gender: $("#genderstring").val() },
success: function (res) {
$("#result").html(res); //add this...
},
error: function () {
}
});
});
});
</script>
3.Controller:
您需要 return PartialView 而不是 returning View,因为如果您 return 查看它将再次生成布局(例如导航栏)(你可以自己试试)
[HttpGet]
public IActionResult Index(string gender)
{
if (gender == null)
{
return View(new User { Name = "", Gender = "" });
}
else
{
ViewBag.Gender = gender;
return PartialView("Index"); //change here...
}
}
结果:
第二种方式
您可以避免使用ajax,只需使用window.location.href
重新加载页面(视图和控制器与您的相同,不要更改喜欢第一种方式):
<script>
$(document).ready(function () {
$('#genderstring').on('change', function () {
window.location.href = "/Home/Index?gender=" + $("#genderstring").val();
});
});
</script>
结果:
注:
如果您想维护 select 列表select编辑的项目,您可以选择第一个方式,并像下面这样修改你的 js:
<script>
$(document).ready(function () {
//ajax for posting gender to controller
$('#genderstring').on('change', function () {
var selected_item = $("#genderstring").val(); //add this ....
$.ajax({
url: '@Url.Action("Index", "Home")',
type: 'GET',
data: { gender: selected_item },
success: function (res) {
$("#result").html(res);
$("#genderstring").val(selected_item); //add this....
},
error: function () {
}
});
});
});
</script>
结果:
在部分视图中更改“性别”下拉列表后,我试图将“姓名”文本框颜色更改为(如果是男性则为蓝色,如果是女性则为粉红色)。
索引视图:
@{
ViewData["Title"] = "Home Page";
var gender = ViewBag.Gender; //breakpoint
}
@if (gender == "Male")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightblue" />
</div>
}
else if (gender == "Female")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightpink" />
</div>
}
else
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: white" />
</div>
}
<div id="gender">
<partial name="_GenderDropdown" model="Model" />
</div>
局部视图:
<label>Gender</label>
<select id="genderstring">
<option value="">Select Gender</option>
<option value="Male">Male</option>
<option value="Female">Female</option>
</select>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
//ajax for posting gender to controller
$('#genderstring').on('change', function () {
$.ajax({
url: '@Url.Action("Index", "Home")',
type: 'GET',
data: { gender: $("#genderstring").val() },
success: function () {
},
error: function () {
}
});
});
});
</script>
控制器:
public IActionResult Index(string gender)
{
if(gender == null)
{
return View(new User { Name = "", Gender = "" });
}
else
{
ViewBag.Gender = gender;
return View("Index"); //breakpoint
}
}
通过这 2 个断点,我可以看到数据正在传递,但在我更改性别后,它会进入 viewbag 中带有性别的视图,但页面的其余部分不会 运行。
当你使用ajax时,后台代码完成后不会重新加载你的页面 default.More 详细解释和解决方案你可以查看如下:
第一种方式
您可以使用 .html()
方法在 ajax 成功后将后端结果渲染到 html:
1.View(一定要加一个div来包含整个html):
<div id="result"> //add the div......
@if (gender == "Male")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightblue" />
</div>
}
else if (gender == "Female")
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: lightpink" />
</div>
}
else
{
<div id="name">
<label asp-for="Name">Name</label>
<input id="nametextbox" type="text" asp-for="Name" style="background-color: white" />
</div>
}
<div id="gender">
<partial name="_GenderDropdown" model="Model" />
</div>
</div>
2.Js 局部视图:
<script>
$(document).ready(function () {
$('#genderstring').on('change', function () {
$.ajax({
url: '@Url.Action("Index", "Home")',
type: 'GET',
data: { gender: $("#genderstring").val() },
success: function (res) {
$("#result").html(res); //add this...
},
error: function () {
}
});
});
});
</script>
3.Controller:
您需要 return PartialView 而不是 returning View,因为如果您 return 查看它将再次生成布局(例如导航栏)(你可以自己试试)
[HttpGet]
public IActionResult Index(string gender)
{
if (gender == null)
{
return View(new User { Name = "", Gender = "" });
}
else
{
ViewBag.Gender = gender;
return PartialView("Index"); //change here...
}
}
结果:
第二种方式
您可以避免使用ajax,只需使用window.location.href
重新加载页面(视图和控制器与您的相同,不要更改喜欢第一种方式):
<script>
$(document).ready(function () {
$('#genderstring').on('change', function () {
window.location.href = "/Home/Index?gender=" + $("#genderstring").val();
});
});
</script>
结果:
注:
如果您想维护 select 列表select编辑的项目,您可以选择第一个方式,并像下面这样修改你的 js:
<script>
$(document).ready(function () {
//ajax for posting gender to controller
$('#genderstring').on('change', function () {
var selected_item = $("#genderstring").val(); //add this ....
$.ajax({
url: '@Url.Action("Index", "Home")',
type: 'GET',
data: { gender: selected_item },
success: function (res) {
$("#result").html(res);
$("#genderstring").val(selected_item); //add this....
},
error: function () {
}
});
});
});
</script>
结果: