我有一个包含@ Html.DropDownListFor的视图。当窗体/视图加载时,如果其中一个模型属性具有值(IEnumerable),那么它将创建一堆带有相应数据的div。如果该属性没有任何值(又名Count()== 0),那么它应该在表单上显示一个按钮(这将为该属性创建数据)。
因此,当用户从Dropdown中选择其中一个选项时,我会向填充当前表单/视图的完全相同的操作方法发出ajax调用,但这次,它会在id字段中发送一个值。 / p>
我的动作方法中有一个断点,我确认它已被击中,并且它具有正确的参数值,并为传递给视图的模型创建正确的数据,但是......当模型是发送到视图重新填充,表单上没有任何项目/控件更改。我甚至在cshtml文件中放置了断点,并且还使用了正确的数据。
所以,这是我的控制器:
public ActionResult Index(int? id)
{
var seasonId = id;
if (seasonId == null)
{
var player = _playerRepository.Query().FirstOrDefault(p => p.PlayerId == _userIdentity.PlayerId);
if (player.DefaultSeasonId != null)
seasonId = (int)player.DefaultSeasonId;
else
{
return View(new ScheduleModel
{
Player = player,
AvailableSeasons = _seasonRepository.Query().Select(s => s)
});
}
}
return View(CreateScheduleModelForSeason((int)seasonId));
}
这是我观点的开始:
@model LeagueManager.Models.ScheduleModel
@{
ViewBag.Title = "Schedule(s)";
}
<div class="row">
@Html.LabelFor(m => m.AvailableSeasons)
@Html.DropDownListFor(m => m.SelectedSeasonId, new SelectList(Model.AvailableSeasons, "SeasonId", "SeasonName"), new { id = "seasonSelect" })
</div>
<form method="post" action="Schedule/GenerateSchedule">
<h2>The Season's Schedules/Weeks and Matchups</h2>
<div>
<div>
@if (Model.SchedulesAndMatches == null || (Model.SchedulesAndMatches != null && !Model.SchedulesAndMatches.Any()))
{
<input type="submit" class="btn btn-primary" value="Generate Schedule" />
}
</div>
这是ajax电话:
@* Season Selector *@
$('select#seasonSelect').change(function () {
var selectedSeasonId = $(this).val();
$.ajax({
url: '/Schedule/Index',
data: { id: selectedSeasonId }
});
});
同样,所有实际代码都在工作,它只是不重新渲染视图......
示例:在调用id = 1的ActionResult方法时,它会加载整个计划。当通过下拉列表切换到id = 2(然后通过ajax再次调用)时,它会保持相同的时间表。
另一方面:当调用id = 2的ActionResult方法时,它会加载单个按钮。通过下拉列表切换到id = 1时,它会重新填充模型中的正确数据,但视图/表单不会反映新信息。
请帮忙!
答案 0 :(得分:7)
使用ajax调用action时无法返回视图,必须返回json数据。 所以你的解决方案是删除ajax调用并使用你的帖子设置window.location ..
@* Season Selector *@
$('select#seasonSelect').change(function () {
var selectedSeasonId = $(this).val();
window.location = '/Schedule/Index/' + selectedSeasonId;
});