Свойство IEnumerable с MVC3 EditorTemplate - PullRequest
1 голос
/ 25 января 2012

Аналогично этому сообщению Свойство IEnumerable модели в шаблоне редактора ASP.NET MVC 3 , у меня есть

Модель

public class Student
{
    public int StudentId { get; set; }
    public string StudentName{ get; set; }

    //FYI..Its virtual because of EF relationship
   public virtual ICollection<Class> Classes{ get; set; }
}
public class Class
{
    public int ClassId { get; set; }
    public string ClassName{ get; set; }     
}

Просмотр - EditStudent

@model Student

@Html.TextBoxFor(m => m.StudentName)

//I get the error for following..see below
@Html.EditorFor(m => m.Classes);

Студент / EditorTemplates / Класс

@model Class

<div>
    @*checkbox here*@
    @Html.LabelFor(x => x.ClassName)
</div>

Контроллер

public ActionResult EditStudent(int id)
{
    ViewBag.Classes = repository.GetClasses();
    Student student = repository.GetStudent(id);

    return View("EditStudent", student);
}
  1. Ошибка в представлении для оператора @ Html.EditorFor (m => m.Classes); есть ..

    Элемент модели переходит в словарь типа 'System.Collections.Generic.HashSet`1 [Class]', но этот словарь Требуется элемент модели типа «Класс».

  2. По сути, я пытаюсь отобразить список всех доступных классов с флажком рядом с ним (я еще не достиг этой части кода). Затем проверьте все классы, чтобы учащийся был зачислен и позволил изменить выбор.

    • Как отобразить список флажков с данной моделью.
    • Должен ли я связать свой EditorTemplate с ViewBag.Classes (как?) Или?
    • Мне также нужно получить выбранные значения флажков в Post ActionMethod.
    • Я прочитал некоторые посты, в которых предлагается создать CheckBoxListHelper, но это должно быть возможно сделать с EditorTemplate, так как мне нужно отобразить простой список.

Пожалуйста, предложите. Спасибо.

1 Ответ

1 голос
/ 31 января 2012

Хорошо, я понял это. Благодаря очень точному сообщению здесь

Как предоставить шаблон Editor для IEnumerable ?

Сначала я переименовал шаблон EditorTemplate в StudentClass - не уверен, имеет ли это какое-либо отношение к привязке или нет, но я это сделал.

Во-вторых, измененный шаблон EditorTemplate для связывания с IEnumerable

@model IEnumerable<Class>
var checked = "";
@foreach (Class class in ViewBag.Classes)
{
    if (Model != null)
    {
        Class class = Model.FirstOrDefault(c => c.ClassId.Equals(class.ClassId));
        if (class != null)
        {
            checked = "checked=checked";
        }
    }
    <input type="checkbox" name="Classes" value="@class.ClassId" @checked />
    @class.ClassName
}

И я называю шаблон с именем

@Html.EditorFor(m => m.Classes, "StudentClass"); 

Теперь в методе Post контроллера я могу получить массив Classes (имена флажков).

...