问题描述
我想要一个系统,其中:
- 第一次访问该页面时,用户会看到当前一周的事件列表;
- 用户从下拉周选择器中选择一个星期,并且该星期的开始日期显示在文本输入字段中;
- 用户按下“ go”,然后页面刷新(如果我想看的话,则不刷新)并显示给定一周的事件列表。
到目前为止,第1部分和第2部分工作正常。
那么,我在此代码中缺少什么,以便模型以新的给定日期(一周的开始)更新,并且页面刷新以显示所述周的项目?据我了解,模型绑定是自动发生的,因此我不需要在IndexNewDate方法中放置任何明确内容即可使用输入的日期更新模型,对吗?
我的模特:
public class Plannerviewmodel
{
public List<PlannerLib.Models.EventModel> Events { get; set; }
public DateTime startDate { get; set; }
}
我的观点(相关部分):
<div class="weekSelector">
<form method="post" asp-controller="HomeController" asp-action="chooseWeek" autocomplete="off">
<input type="text" asp-for="IndexNewDate" name="startDate" id="weekPicker" autocomplete="off"/>
<input type="submit" value="Go" class="submit" />
</form>
</div>
我的控制器:
public class HomeController : Controller
{
public IActionResult Index()
{
DateTime weekStart = new DateTime(2020,10,1);
Plannerviewmodel model = new Plannerviewmodel();
model.Events = new List<PlannerLib.Models.EventModel>();
model.Events = PlannerController.AcquireWeekData(weekStart).ToList();
return View(model);
}
[HttpPost]
public IActionResult IndexNewDate(Plannerviewmodel model) {
DateTime weekStart = model.startDate;
model.Event = new List<PlannerLib.Models.EventModel>();
model.Event = PlannerController.AcquireWeekData(weekStart).ToList();
return View(model);
}
}
对于上下文,JS Weekpicker:
$(function () {
var startDate;
var endDate;
$('#weekPicker').datepicker({
firstDay: 1,dateFormat: 'dd-mm-yy',changeMonth: true,changeYear: true,showButtonPanel: true,onSelect: function (dateText,inst) {
var date = $(this).datepicker('getDate');
startDate = new Date(date.getFullYear(),date.getMonth(),date.getDate() - date.getDay() + 1);
endDate = new Date(date.getFullYear(),date.getDate() - date.getDay() + 6);
var dateFormat = inst.settings.dateFormat || $.datepicker.dateFormat;
$('#startDate').text($.datepicker.formatDate(dateFormat,startDate,inst.settings));
$('#endDate').text($.datepicker.formatDate(dateFormat,endDate,inst.settings));
$(this).val($.datepicker.formatDate(dateFormat,inst.settings));
}
});
});
解决方法
所以有些地方我弄错了。
首先,我没有在视图文件顶部添加* @ addTagHelper ,Microsoft.AspNetCore.Mvc.TagHelpers 。
这使我看到我的标签助手是错误的。 asp-for 标签应引用其所针对的模型中的变量,而不是控制器中的操作。其次,由于一些改组,我在 asp-action 中留下了一个旧动作(无论如何还是不正确的)。现在,我已对其进行更新,以引用控制器中的正确操作。
ERROR Error: Cannot find control with name: 'textbox88'
at _throwError (forms.js:2293)
at setUpControl (forms.js:2201)
at FormGroupDirective.push../node_modules/@angular/forms/fesm5/forms.js.FormGroupDirective.addControl (forms.js:5427)
at FormControlName.push../node_modules/@angular/forms/fesm5/forms.js.FormControlName._setUpControl (forms.js:6028)
at FormControlName.push../node_modules/@angular/forms/fesm5/forms.js.FormControlName.ngOnChanges (forms.js:5949)
at checkAndUpdateDirectiveInline (core.js:21092)
at checkAndUpdateNodeInline (core.js:29494)
at checkAndUpdateNode (core.js:29456)
at debugCheckAndUpdateNode (core.js:30090)
at debugCheckDirectivesFn (core.js:30050)
我还删除了对 asp-controller 的引用,因为这会影响发布请求。
实际上,在控制器中不需要其他动作名称。
<div class="weekSelector">
<form method="post" asp-action="**Index**" autocomplete="off">
<input type="text" asp-for="**startDate**" name="startDate" id="weekPicker" autocomplete="off" />
<input type="submit" value="Go" class="submit" />
</form>
</div>
现在有两个 Index()操作,分别由HttpPost和HttpGet以及它们是否将模型作为参数来区分。