Модель сложного типа не будет правильно проходить список

привет, ребята, у меня проблемы с моим приложением mvc. это простое приложение для викторины, и я застрял в создании представления для модели вопроса.

У меня есть модель вопросов и вариантов с соответствующими моделями представлений (в моем случае это QustionDTO и OptionDTO), и я хочу создать cshtml представление для вопроса со списком параметров. вот так, но когда я отправляю форму, мой список опций пуст. это моя модель вопросов и вариантов

 public class Question
 {
     [Key]
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public int Id { get; set; }
     [Required]
     public string QuestionText { get; set; }
     public virtual ICollection<Option> Options { get; set; }
 }

public class Option
{
     [Key]
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public int Id { get; set; }
     [Required]
     [Display(Name ="Answer text")]
     public string OptionText { get; set; }
     [Required]
     public bool IsCorrect { get; set; }
}

это мои модели DTO

public class QuestionDTO
{
    public int Id { get; set; }
    public string QuestionText { get; set; }
    public List<OptionDTO> Options { get; set; }
}
public class OptionDTO
{
    public int Id { get; set; }
    public string OptionText { get; set; }
    public bool IsCorrect { get; set; }
}

и это мое представление с шаблоном редактора, расположенным в "~/views/shared/editortemplate/OptionDTO.cshtml"

@model Quiz.BusinessEntites.QuestionDTO

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>QuestionDTO</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.QuestionText, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.QuestionText, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.QuestionText, "", new { @class = "text-danger" })
            </div>
        </div>
        <table class="table" style="width:50%">
            @for (int i = 0; i < 3; i++)
            {
                @Html.EditorFor(model=>model.Options[i])
            }
        </table>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

это шаблон редактора OptionDTO

@using Quiz.BusinessEntites
@model Quiz.BusinessEntites.OptionDTO
<tr>
    <th class="col-md-2">
        @Html.DisplayNameFor(m => m.OptionText)
    </th>
    <th class="col-md-2">
        @Html.DisplayNameFor(m => m.IsCorrect)
    </th>
</tr>
<tr>
    <td class="col-md-2">
        @Html.EditorFor(m => m.OptionText)
    </td>
    <td class="col-md-2">
        @Html.EditorFor(m => m.IsCorrect)

    </td>
</tr>

на изображении выше вы можете видеть, что список опций равен нулю. если у вас есть какие-либо предложения, это будет оценено.


person Stefan Ivovic    schedule 24.08.2017    source источник
comment
В качестве примечания, это просто @Html.EditorFor(m =>m.Options) и не for цикл (метод EditorFor() принимает IEnumerable и генерирует правильный html для каждого элемента в коллекции   -  person    schedule 25.08.2017
comment
но если я хочу сделать несколько шаблонов editorfor, которые мне нужно использовать для цикла? как в моем случае, или я что-то пропустил. просто чтобы вы знали, что это работает.   -  person Stefan Ivovic    schedule 25.08.2017
comment
Нет, ты не. Прочтите комментарий еще раз!   -  person    schedule 26.08.2017


Ответы (1)


В вашем методе действия http post атрибут Bind со списком Include указывает связывателю модели привязывать только свойства «Id», «QuestionText» и «IsCorrect» объекта QuestionDto из опубликованных данных формы. Таким образом, связыватель модели не будет связывать значение свойства Options.

Удалите атрибут Bind из метода действия публикации Http. Нет необходимости использовать атрибут Bind, если ваша модель представления специфична для вашего представления, это означает, что у вас есть только свойства, необходимые для вашего представления (в вашем случае это выглядит так)

public ActionResult Create(QuestionDTO model)
{
  // to do :return something
}

Если вы хотите использовать модель представления, не относящуюся к представлению, но по-прежнему хотите использовать атрибут Bind для указания только подмножества свойств, включите только эти свойства. В вашем случае ваш код будет похож на

public ActionResult Create([Bind(Include="Id,QuestionText",Options"] QuestionDTO model)
{
  // to do :return something
}

Кроме того, представление шаблона редактора должно находиться в каталоге с именем EditorTemplates , а не EditorTemplate.

person Shyju    schedule 24.08.2017