mvc 4 Как заполнить выпадающий список из коллекции в модели на странице создания

#c# #asp.net-mvc #html.dropdownlistfor

#c# #asp.net-mvc #html.dropdownlistfor

Вопрос:

Я уверен, что это простая вещь, которую мне не хватает. Я пытался добавить выпадающий список в Create.cshtml с целью заполнения списка из базы данных. Для эксперимента я выбрал следующее: два класса, соответствующие таблицам базы данных, которые имеют значения.

 namespace MvcTestApplication.Models
{
public class Complaints
{
    public int ID { get; set; }
    public string User { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string  Nature { get; set; }
    public string Month { get; set; }
    public string Year { get; set; }
    public string Account { get; set; }
    public string Employee { get; set; }
    public string Manager { get; set; }
    public int CompanyID { get; set; }
    public int CompanyNumID { get; set; }
    public int DepartmentID { get; set; }
    public int ClientID { get; set; }
    public int ClientCodeID { get; set; }
    public string Source { get; set; }
    public string Status { get; set; }

    public virtual ICollection<Company> Companies{ get; set; }
}
namespace MvcTestApplication.Models
{
public class Company
{
    public int CompanyID { get; set; }
    public string CompanyName { get; set; }
    public bool enabled { get; set; }

}
}
  

затем DAL

 namespace MvcTestApplication.DAL
{

public class ComplaintDBContext : DbContext
{
    public DbSet<Complaints> Complaints { get; set; }

}
  

На странице create.cshtml я просто хочу иметь возможность заполнить выпадающий список компаниями (еще много выпадающих списков после того, как я заработаю), но пока я всегда получаю нулевую ссылку всякий раз, когда пытаюсь. В create actionresult я попытался передать новую модель жалоб, только модель жалоб, мне не хватает, как заполнить коллекцию компаний.

  <div class="editor-label">
        @Html.LabelFor(model => model.ReleaseDate)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ReleaseDate, new { id = "release_date" })
        @Html.ValidationMessageFor(model => model.ReleaseDate)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Source)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Source)
        @Html.ValidationMessageFor(model => model.Source)
    </div>
  <div class="editor-label">
        @Html.LabelFor(model => model.CompanyID)
    </div>
    <div class="editor-field">
    @Html.DropDownListFor(model => model.CompanyID , new SelectList(Model.Companies , "CompanyID", "CompanyName"), "-- Select Company--")

        @Html.ValidationMessageFor(model => model.CompanyID)
    </div>
  

Комментарии:

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

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

3. Я думаю, что у меня получилось: public ActionResult Create() { List<Company> comps = db.Companies . ToList(); return View(новые жалобы { Nature = «test this», Source = «Email», ReleaseDate = DateTime. Теперь, Companies = comps }); //return View(); }

4. и теперь я пытаюсь работать над тем, как отобразить значение companyid (companyname) в индексном представлении.

Ответ №1:

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

Вам нужно сохранить его в ~/Views/Shared/EditorTemplates/Complains.cshtml:

 @model Complaints

<div>
    @Html.LabelFor(x => x.id): 
    @Html.EditorFor(x => x.id)

    @Html.LabelFor(x => x.Nature): 
    @Html.EditorFor(x => x.Nature)

    @Html.LabelFor(x => x.ReleaseDate): 
    @Html.EditorFor(x => x.ReleaseDate)

    @Html.LabelFor(x => x.Source): 
    @Html.EditorFor(x => x.Source)

    @Html.LabelFor(x => x.Status): 
    @Html.EditorFor(x => x.Status)
</div>
  

Для нас просто напишите:

 @Html.EditorFor(model => model.Complaints)