Выпадающий список для nullable int

466
01 апреля 2018, 17:16

Сайт на 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>
Answer 1

В общем, решение оказалось тривиальным. Нужно было заменить

<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.".

READ ALSO
Программа проходит не все тесты

Программа проходит не все тесты

Есть программа, которая, используя метод ConsoleReadLine(), вводит строку, содержащую три числа через пробел — сумму, процентную ставку (в процентах)...

302
unity общение сервер-клиент

unity общение сервер-клиент

Необходимо чтобы Клиент передавал данные(переменные) Серверу, а Сервер отвечал на запрос

322
Сложное приложение на одной windows form

Сложное приложение на одной windows form

Подскажите пожалуйста, как создать сложное приложение windows form с использованием только одной формы что бы наполнение формы нужными элементами...

270
Один dataGridView на две datetimePicker C# winforms

Один dataGridView на две datetimePicker C# winforms

Добрый день всемЕсть данные в dataGridView и еще есть две datetimePicker

271