2013-07-01 2 views
0

У меня есть следующая модель & простой выпадающий на вид. Я хочу заполнить имя клиента в раскрывающемся списке. Я пробовал следующий код, но это не сработало, может кто-нибудь, что не так с этим кодом.Как использовать @ Html.DropDownListFor с пользовательским типом данных

Модель

public class customer 
{ 

public int id { get; set; } 
public string name { get; set; } 
public string address { get; set; } 

    } 

//////////////////////////

@{ 
    Layout = null; 
    } 

    @model IEnumerable<MvcApplication1.customer> 

     <!DOCTYPE html> 

     <html> 
    <head> 
     <meta name="viewport" content="width=device-width" /> 
     <title>Index</title> 
    </head> 
     <body> 
     <div> 

@Html.DropDownListFor(m=>m.name, new SelectList(Model,"id","name")); 

     </div> 
+0

_ «это не сработало» _ - объясните пожалуйста. – CodeCaster

+0

Я получаю это сообщение об ошибке: CS1061: «System.Collections.Generic.IEnumerable » не содержит определения для «name» и никакого метода расширения «name», принимающего первый аргумент типа «System.Collections» .Generic.IEnumerable 'может быть найден (вам не хватает директивы using или ссылки на сборку?) –

+0

Ваша модель 'IEnumerable ' или список клиентов, но с '@Html. DropDownListFor (m => m.name) 'вы пытаетесь получить доступ к одному экземпляру' customer'. – CodeCaster

ответ

2

В вашей попытке сделать это, вы сделали некоторые основные ошибки. Сначала попробуйте понять, что происходит за сценой в MVC и что означают эти ключевые слова.

вы определили

@model IEnumerable<MvcApplication1.customer> 

то есть следующий код

@Html.DropDownListFor(m=>m.name, new SelectList(Model,"id","name")); 

здесь, ваш m обозначает @model, который вы инициализируется как IEnumerable<MvcApplication1.customer>. Вы пытаетесь получить доступ к свойству с именем name в IEnumerable (m => m.name), а IEnumerable не имеет такого свойства. если вы хотите каким-то образом получить доступ к своей модели, то ваш @model должен быть объектом Customer. Тогда вы можете получить к нему доступ, как @Html.DropDownListFor(m=>m.name, new SelectList(Model,"id","name"));

в комментарии, вы сказали, что этот код @Html.DropDownList("name", new SelectList(Model, "id", "name")); отлично работает. Да, это работает, потому что вы создаете новый элемент выбора html с идентификатором "name" и перечисляете все, что находится в Model, в качестве опций.

Хорошо, достаточно информация.

Это решение, которое я предлагаю для вашей проблемы.

В вашем управлении контроллером реализуйте поток кода следующим образом.

var dropdownDataList = //select your data from the database or any place as a list; 

var dropdownOptions = dropdownDataList.Select(d => new { 
    id = d.valueforid, 
    name = d.valueforname 
}); 

ViewBag.DropdownListOptions = new SelectList(dropdownOptions, "id", "name"); 

return View(); 

сейчас, на ваш взгляд, сделайте следующее.

@{ 
    Layout = null; 
} 

@model MvcApplication1.customer 

<!DOCTYPE html> 

<html> 
    <head> 
     <meta name="viewport" content="width=device-width" /> 
     <title>Index</title> 
    </head> 
    <body> 
     <div> 
      @Html.DropDownListFor(m=>m.name, (SelectList)ViewBag.DropdownListOptions) 
     </div> 
    </body> 
</html> 

попытайтесь просмотреть эти статьи в MSDN. http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx

надеюсь, что это поможет.

Cheers, Амила

0

попробовать это изменить модель на что-то вроде этого

public class customer 
{ 

public int id { get; set; } 
public string SelectedName { get; set; } 
public IEnumerable<SelectListItem> Names { get; set; } 
public string address { get; set; } 

    } 

в контроллере

[HttpGet] 
public ActionResult Customer() 
{ 
    var names=//collect names from database 
    var model = new Customer 
    { 
     Names = names.Select(m=> new SelectListItem 
     { 
      value = m.whatever value you want to get(probably Id) 
      text = m.name you want to display 
     }) 
    }; 
    return View(model); 
} 

и ввиду

@model MvcApplication1.customer 
@Html.DropDownListFor(model => model.SelectedName, Model.Names) 
2

Есть много образцов на этот точный вопрос о переполнении стека. Я уже много раз отвечал.

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

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

public class CustomerViewModel 
{ 
    public int CustomerId { get; set; } 

    public IEnumerable<Customer> Customers { get; set; } 
} 

Ваш класс клиента:

public class Customer 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

Ваш контроллер:

public class CustomerController : Controller 
{ 
    private readonly ICustomerRepository customerRepository; 

    public Customer(ICustomerRepository customerRepository) 
    { 
      this.customerRepository = customerRepository; 
    } 

    public ActionResult Create() 
    { 
      CustomerViewModel viewModel = new CustomerViewModel 
      { 
       Customers = customerRepository.GetAll() 
      }; 

      return View(viewModel); 
    } 
} 

Ваше мнение:

@model YourProject.ViewModels.Customers.CustomerViewModel 

@Html.DropDownListFor(
    x => x.CustomerId, 
    new SelectList(Model.Customers, "Id", "Name", Model.CustomerId), 
    "-- Select --" 
) 
@Html.ValidationMessageFor(x => x.CustomerId) 

Надеюсь, это поможет.

Смежные вопросы