Как создать выпадающий из модели? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть две модели:

public class Question
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int ClosedReasonId { get; set; }
    public CloseReasonType CloseReasonType { get; set; }
}

public class CloseReasonType
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Question> Questions { get; set; }
}

Я хотел бы создать представление, в котором есть форма для добавления вопросов и раскрывающийся список для CloseReasonType.

@page
@model RazorPagesQuestion.Pages.Questions.CreateModel

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>Question</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Question.Title" class="control-label"></label>
                <input asp-for="Question.Title" class="form-control" />
                <span asp-validation-for="Question.Title" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Question.CloseReasonType" class="control-label"></label>
                <select asp-for="Question.CloseReasonType" class="form-control"
                        asp-items="Model.CloseReasonType">

                </select>
                <span asp-validation-for="Question.CloseReasonType" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

Конечно, когда я только что добавил asp-items="Model.CloseReasonType" в мой помощник тега select, он не заполнял список опциями. Как я могу заполнить параметры?

Я добавил это в свой класс CreateModel

    [BindProperty]
    public Question Question { get; set; }

    [BindProperty]
    public List<SelectListItem> CloseReasonType { get; }

Все примеры, которые я видел, показывают, как создать список из жестко закодированных значений.

Полный класс:

public class CreateModel : PageModel
{
    private readonly RazorPagesQuestion.Data.RazorPagesQuestionContext _context;

    public CreateModel(RazorPagesQuestion.Data.RazorPagesQuestionContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        return Page();
    }

    [BindProperty]
    public Question Question { get; set; }

    [BindProperty]
    public List<SelectListItem> CloseReasonType { get; }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.Question.Add(Question);
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

1 Ответ

1 голос
/ 12 февраля 2020

Вам потребуется заполнить список выбора, чтобы он отображался на странице

Предполагая, что ваш DbContext имеет свойство CloseReasonTypes

//...

private void loadCloseReasonTypes() {
    CloseReasonTypes = new SelectList(_context.CloseReasonTypes, nameof(CloseReasonType.Id), nameof(CloseReasonType.Name));
}

public IActionResult OnGet() {
    loadCloseReasonTypes();
    return Page();
}

public SelectList CloseReasonTypes { get; set; }

[BindProperty]
public Question Question { get; set; }

//...

Обновите представление, чтобы связать с соответствующим свойство модели.

<div class="form-group">
    <label asp-for="Question.CloseReasonId" class="control-label">Close Reason</label>
    <select asp-for="Question.CloseReasonId" class="form-control"
            asp-items="Model.CloseReasonTypes">

    </select>
    <span asp-validation-for="Question.CloseReasonId" class="text-danger"></span>
</div>

Список также необходимо будет заполнить повторно, если публикация не удалась, поскольку страница перезагрузится, очистив список выбора.

public async Task<IActionResult> OnPostAsync() {
    if (!ModelState.IsValid) {
        loadCloseReasonTypes();
        return Page();
    }

    _context.Question.Add(Question);
    await _context.SaveChangesAsync();

    return RedirectToPage("./Index");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...