Сайт на asp.net core 2.0, нужно сделать CRUD-контроллер для такой сущности:
public class Season
{
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string Title { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int? ParentSeasonId { get; set; }
public Season ParentSeason { get; set; }
}
Стандартный код контроллера, который предлагает студия почему-то запрещает ввод NULL значения в поле parent season.
Сам контроллер:
// GET: Season/Create
public IActionResult Create()
{
this.ViewData["ParentSeasonId"] = new SelectList(this._context.Seasons, "Id", "Title");
return this.View();
}
// POST: Season/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,GlobalNum,Title,StartDate,EndDate,ParentSeasonId")] Season season)
{
if (this.ModelState.IsValid)
{
this._context.Add(season);
await this._context.SaveChangesAsync();
return this.RedirectToAction(nameof(this.Index));
}
this.ViewData["ParentSeasonId"] = new SelectList(this._context.Seasons, "Id", "Title", season.ParentSeasonId);
return this.View(season);
}
// GET: Season/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return this.NotFound();
}
var season = await this._context.Seasons.SingleOrDefaultAsync(m => m.Id == id);
if (season == null)
{
return this.NotFound();
}
this.ViewData["ParentSeasonId"] = new SelectList(this._context.Seasons, "Id", "Title", season.ParentSeasonId);
return this.View(season);
}
// POST: Season/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,GlobalNum,Title,StartDate,EndDate,ParentSeasonId")] Season season)
{
if (id != season.Id)
{
return this.NotFound();
}
if (this.ModelState.IsValid)
{
try
{
this._context.Update(season);
await this._context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!this.SeasonExists(season.Id))
{
return this.NotFound();
}
else
{
throw;
}
}
return this.RedirectToAction(nameof(this.Index));
}
this.ViewData["ParentSeasonId"] = new SelectList(this._context.Seasons, "Id", "Title", season.ParentSeasonId);
return this.View(season);
}
Представления:
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<input asp-for="Title" class="form-control" />
<span asp-validation-for="Title" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="StartDate" class="control-label"></label>
<input asp-for="StartDate" class="form-control" />
<span asp-validation-for="StartDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="EndDate" class="control-label"></label>
<input asp-for="EndDate" class="form-control" />
<span asp-validation-for="EndDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ParentSeasonId" class="control-label"></label>
<select asp-for="ParentSeasonId" class ="form-control" asp-items="ViewBag.ParentSeasonId"></select>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</form>
В общем, решение оказалось тривиальным. Нужно было заменить
<select asp-for="ParentSeasonId" class ="form-control" asp-items="ViewBag.ParentSeasonId"></select>
на
<select asp-for="ParentSeasonId" class="form-control" asp-items="ViewBag.ParentSeasonId">
<option value="">Please select one</option>
</select>
Причём именно на value="", потому что я пробовал пару вариантов, смотря какие данные приходят в POST, этот например не сработает:
<option>Please select one</option>
вылетит с ошибкой "The value 'Please select one' is not valid for ParentSeasonId.".
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости