2016-01-12 4 views
8

Я пытаюсь использовать помощники тегов MVC6 для создания раскрывающегося списка CountryCode и CountryName, чтобы пользователь мог выбрать свою страну после регистрации. Соответствующая часть зрения выглядит это так далекоMVC6 Dropdownlist of Countries

<form asp-controller="Manage" asp-action="EditCountry" asp-route-returnurl="@ViewData["ReturnUrl"]"> 
    <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div> 
    <select asp-for="CountryCode" asp-items="@Model.Countries"></select> 

соответствующая часть ViewModel выглядит следующим образом

[Display(Name = "Country")] 
    public string CountryCode { get; set; } 
    public IEnumerable<Country> Countries { get; set; } 

Страновые выглядит как этот

public partial class Country 
{ 
    [Key] 
    public string CountryCode { get; set; } 
    public string CountryName { get; set; } 
    public virtual ICollection<ApplicationUser> Users { get; set; } 
} 

Контроллер возвращающего список стран к модели наблюдения

  var model = new IndexViewModel 
     { 
      CountryCode = user.CountryCode, 
      Countries =_customersContext.Countries.OrderBy(c=>c.CountryName), 
     }; 
     return View(model); 
    } 

, но с точки зрения asp-items="@Model.Countries" имеет деформированный Cannot convert Country to SelectListItem

Кроме того, я не могу найти, как в форме, чтобы указать COUNTRYCODE как собственность, чтобы вернуть и COUNTRYNAME как свойство для отображения.

ответ

35

Способ создания моих выпадающих списков несколько аналогичен, за исключением того, что в моей модели ViewModel моя собственность имеет тип SelectList вместо IEnumerable<>.

public class HomeViewModel 
{ 
    public string CountryCode { get; set; } 
    public SelectList CountryList { get; set; } 
} 

Тогда в контроллере я получаю данные и преобразовать его в анонимный список с двумя свойствами «Id» и «Значение».

В свою очередь, я создаю новый SelectList(), проходящий в анонимном списке, указав, что такое dataValueField и что такое dataTextField.

public IActionResult Index() 
{ 
    var countries = _customersContext.Countries.OrderBy(c => c.CountryName).Select(x => new { Id = x.Code, Value = x.Name }); 

    var model = new HomeViewModel(); 
    model.CountryList = new SelectList(countries, "Id", "Value"); 

    return View(model); 
} 

Наконец, в представлении:

<div class="form-group"> 
    <label asp-for="CountryCode" class="col-md-2 control-label"></label> 
    <div class="col-md-10"> 
     <select asp-for="CountryCode" asp-items="@Model.CountryList"></select> 
    </div> 
</div> 
+0

Благодарим вас за разъяснение. Это сработало. – Vague

2
public class MyViewModel //MODEL LAYER 
    { 
     public int CountryId { get; set; } 

    public string CountryName { get; set; } 
    public List<Employee> EmployeesList { get; set; } 
} 

public class Employee 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
} 

public IActionResult Contact1() //CONTROLLER 
     { 

     MyViewModel N1 = new MyViewModel(); 
     List<Employee> N2 = new List<Employee>() 
     { 
      new Employee { Id=1,FullName="sivaragu" }, 
      new Employee { Id=2,FullName="siva" }, 
        new Employee { Id=3,FullName="SENTHIL" } 
     }; 

     ViewBag.MovieType = N2; 
     return View();    
    } 

CSHTML (MVC6)

<select asp-for="CountryId" asp-items="@(new SelectList(@ViewBag.MovieType,"Id","FullName"))">  
    </select> 
+0

+0

ДАННЫЙ КОД CSHTML –

1

Я предложил альтернативный способ сделать это за счет расширения SelectTagHelper с некоторыми более атрибуты, которые могут сделать этот тип развития более удобным. Вопрос обсуждается here.

Он основан на классе SelectListDescriptor, который содержит список элементов, свойство для отображения поля текста и значения соответственно. Затем на вид один простой тип

<select asp-descriptor="@ViewBag.CountryDescriptor"><option value="">-- Choose country</option<</select>.

Дескриптор страны - всего лишь new SelectListDescriptor(nameof(Country.CountryCode), nameof(Country.CountryName), countries). Это позволяет избежать магических строк, используя мощность `nameof-operator

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