Привязка модели к списку переменной длины - PullRequest
0 голосов
/ 28 июня 2018

Как создать пользовательский интерфейс, позволяющий пользователю создавать параметры для вопроса? Представление (Form.cshtml) должно разрешать привязку переменного количества текстовых вводов (два или более в любое время) к переменному количеству @ Model.Options [i] .OptionText. Есть ли для этого разметка Razor или помощники тегов? Причина, по которой существует класс «Option», заключается в том, что Entity Framework Core не позволяет сохранять коллекцию примитивных типов, включая строки.

Option.cs

namespace MyProject.Models
{
     public class Option
     {
         public int OptionId { get; set; }
         public string OptionText { get; set; }
         public int QuestionId { get; set; }
         public Question Question { get; set; }
     }
}

Question.cs

namespace MyProject.Models 
{
    public class Question
    {
        public int QuestionID { get; set; }
        public string Text { get; set; }
        public ICollection<Option> Options { get; set; }
    }
}

CreateQuestionModel.cs

public class CreateQuestionModel
{
    [Required]
    [UIHint("text")]
    public string Text { get; set; }

    [Required]
    [UIHint("hidden")]
    public int FormId { get; set; }

    public ICollection<Options> Options{ get; set; }
}

Form.cshmtl

@model CreateQuestionModel

<form asp-controller="Form" asp-action="Options" method="post">
    <div class="form-group">
        <label asp-for="@Model.Text">Question name</label>
        <input type="text" class="form-control" asp-for="@Model.Text">
    </div>
    <div class="form-group">
        <label asp-for="@Model.Options"></label>
        <input type="text" class="form-control" asp-for="???">
    </div>
    <div class="form-group">
        <label asp-for="@Model.Options"></label>
        <input type="text" class="form-control" asp-for="???">
    </div>

    <button type="submit" class="btn btn-primary">Create Options</button>
</form>

FormController.cs

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Options([Bind("Text, Choices")] Question question)
{
    if (ModelState.IsValid)
    {
        context.Add(question);
        await context.SaveChangesAsync();
        return RedirectToAction("/");
    }

    return RedirectToAction("/");
}
...