2015-07-03 3 views
0

Я довольно новичок в MVC и пытаюсь уйти от формы с помощью WebForms, но некоторые вещи меня смущают, что мне нужно для выполнения определенных действий.Модель привязки MVC к выпадающему списку в поле зрения

На мой взгляд «/areas/admin/cars/form.cshtml» Я хочу использовать @ Html.Dropdownfor, переходящая в списке моих производителей автомобилей, который определяется моделью CarManufacturer.cs. Как мне это сделать, пожалуйста?

Я использую NHibernate - не уверен, если это делает любой другой ...

модель;

public class CarManufacturer 
    { 
     public virtual int Id { get; set; } 
     public virtual string Manufacturer { get; set; } 
     //***do i need the below line?*** 
     public SelectList CarManufacturerList { get; set; } 
    } 

    public class CarManufacturerMap : ClassMapping<CarManufacturer> 
    { 
     public CarManufacturerMap() 
     { 
      Table("CarManufacturers"); 
      Id(x => x.Id, x => x.Generator(Generators.Identity)); 
      Property(x => x.Manufacturer, x => x.NotNullable(true)); 
     } 
    } 

Контроллер вызова формы является carController.cs

public ActionResult New() 
      { 
       //re-susing views for add and edit 
       return View("Form", new CarsForm 
       { 
        IsNew = true, 
       }); 
      } 

      public ActionResult Edit(int id) 
      { 
       var car = Database.Session.Load<Car>(id); 
       if (car == null) 
        return HttpNotFound(); 

       return View("Form", new CarsForm 
       { 
        ...do stuff here to populate form fields!... 
       }); 
      } 

ViewModel;

public class CarsForm 
    { 
     //do I need the below line? 
     public IList<CarManufacturer> Manufacturers { get; set; } 

     public bool IsNew { get; set; }//whether add or edit action to be used 
     public int? CarId { get; set; } 
...more fields 
} 

Большое спасибо за терпение и помощь в получении нового MVC'er.

ответ

0

Обычно я добавляю данные dropdownlist для просмотра. Вы можете удалить списки из своего класса viewmodel и entity.

Ваш контроллер будет выглядеть следующим образом.

public ActionResult New() 
{ 
    ViewBag.Manufacturers = new SelectList(
     Database.Session.Load<Manufacturer>(), 
     "Manufacturer", 
     "Manufacturer"); 
    return View("Form", new CarsForm 
    { 
     IsNew = true, 
    }); 
} 

public ActionResult Edit(int id) 
{ 
    var car = Database.Session.Load<Car>(id); 
    if (car == null) 
     return HttpNotFound(); 

    ViewBag.Manufacturers = new SelectList(
     Database.Session.Load<Manufacturer>(), 
     "Manufacturer", 
     "Manufacturer", 
     car.Manufacturer); //sets the initial value 
    return View("Form", new CarsForm 
    { 
     ...do stuff here to populate form fields!... 
    }); 
} 

Затем на ваш взгляд, вы просто добавить свой @Html.DropDownListFor

@Html.DropDownListFor(model => model.Manufacturer, (SelectList)ViewBag.Manufacturers) 
+0

Ahhh, теперь я вижу, как работает метод viewbag, и я думаю, что предпочитаю передавать модель в DDL, где у меня возникли проблемы! :) Благодаря! –

-1

Это один из подходов, и лично мой предпочтительный подход в небольших проектах, но есть несколько способов скинуть этот конкретный кот.

Надеюсь, вы заметили, что Html.DropDownListFor занимает List<SelectListItem>, так что вы можете пойти дальше и объявить один в вашей модели представления, но вы также будете нуждаться в Id конкретного производителя выбранного:

public class CarsForm 
{ 
    public int ManufacturerId { get; set; } 
    public List<SelectListItem> Manufacturers { get; set; } 

    // Other properties 
} 

в качестве Обратите внимание, что соглашение об именах для моделей просмотра будет, например, CreateCarViewModel.

В вашем методе New, вам нужно будет создать экземпляр Manufacturers из базы данных, как правило, это будет что-то вроде этого:

viewModel.Manufacturers = (from m in dbContext.Manufacturers 
          orderby m.Name 
          select new SelectLisItem { Text = m.Name, Value = m.Id.ToString() }).ToList() 

Теперь в вашем View вы можете сделать:

@Html.DropDownListFor(model => model.Manufacturers, Model.ManufacturerId, "Please select") 
+0

вы, вероятно, получите сообщение об ошибке с помощью m.Id.ToString(), если вы выбираете непосредственно из DbContext – JamieD77

+0

@ user1221684 I «Не уверен, что это так, но легко исправить с помощью« ToList() », тем не менее – ediblecode

+0

вы также можете использовать' SqlFunctions.StringConvert ((double) m.Id) ' – JamieD77