2016-10-03 14 views
2

Я пробовал несколько разных подходов. Я не уверен, почему, но мой SelectList/DropDown пуст. Он не показывает данных. Я не знаю, где я ошибаюсь.Отображение данных в SelectList в ASP.NET Core

У меня есть приложение ASP.NET Core. Ядро Entity Framework. Db Во-первых. Я использую шаблон репозитория.

Вот моя модель класса

public partial class Commodity 
{ 
    public Guid Oid { get; set; } 
    public string Code { get; set; } 
} 

Это мой интерфейс:

interface ICommodityRepository 
{ 
    IEnumerable<Commodity> GetAll(); 
} 

Мой Repository:

public class CommodityRepository : ICommodityRepository 
{ 
    private ltgwarehouseContext context; 

    public CommodityRepository() 
    { } 

    public IEnumerable<Commodity> GetAll() 
    { 
     return context.Commodity.ToList(); 
    } 
} 

Мой контроллер:

public class CommoditiesController : Controller 
{ 
    static readonly CommodityRepository commodities = new CommodityRepository(); 

    public CommoditiesController(CommodityRepository commodities) 
    { } 

    // GET: /<controller>/ 
    public IEnumerable<Commodity> CommoditiesList() 
    { 
     return commodities.GetAll(); 
    } 
} 

Это мой Посмотреть/HTML Markup:

@model Lansing.BasisMap.Domain.Models.Commodity 

<li><select asp-for="@Model.Code" asp-controller="Commodities" asp-action="CommoditiesList"></select> </li>

ответ

4

(я не слишком хорошо знакомы с синтаксисом Tag Helper в ASP.NET Ядра, но я дам ему выстрел, кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь)

  • атрибут asp-for="" не нужен префикс @, потому что я t не является кодом Razor, значение атрибута уже обрабатывается парсером ASP.NET - вам это нужно только в том случае, если вы используете синтаксис C#, который неоднозначен с HTML (например, двойные кавычки).
  • В asp-controller и asp-action атрибуты не применяются к <select>
  • Вы не предоставляют каких-либо опций, которые вам <select>, используйте атрибут asp-items и обеспечить IEnumerable<SelectListItem> или SelectList экземпляр. Это можно передать через ваш ViewModel или (по моему предпочтению) через ViewData (или ViewBag).

Предполагая, что это ViewData, то:

public ActionResult YourControllerAction() { 

    // stuff 
    this.ViewData["items"] = commodities 
     .GetAll() 
     .Select(c => new SelectListItem() { Text = c.Code, Value = c.Oid.ToString() }) 
     .ToList(); 

    // stuff 
    return this.View(viewModel); 
} 

и используется следующим образом:

<select asp-for"Model.Code" asp-items="@ViewData["items"]" /> 

Там много больше примеров в этом QA проводке: Select Tag Helper in ASP.NET Core MVC

1

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

public CommodityRepository(ltgwarehouseContext ltgwc) 
{ 
    context = ltgwc; 
} 

Затем, если вы хотите, чтобы он автоматически населены и вводят в контроллер, необходимо зарегистрировать его в Startup.cs, используя один из методов services.Addxxx. Я рекомендую вам прочитать DI documentation, так как это объяснит это лучше, чем я могу.

Ваш последний контроллер должен выглядеть примерно так:

public class CommoditiesController : Controller 
{ 
    //Declare the local variable 
    ICommodityRepository _commodities; 
    //Load the repository via DI 
    public CommoditiesController(CommodityRepository commodities) 
    { 
     //Set the local variable to the injected one 
     _commodities = commodities; 
    } 

    // GET: /<controller>/ 
    public IEnumerable<Commodity> CommoditiesList() 
    { 
     //Reference the local variable in your methods 
     return _commodities.GetAll(); 
    } 
}