ASP.Net Core 6 使用 SelectList 时出现问题

问题描述 投票:0回答:1

我有 2 个具有一对多关系的模型,想制作下拉列表 Model 1 View Page 并且有我的代码:

模型 1

public class Events
{
    public Guid Id { get; set; }
    [Required(ErrorMessageResourceType = typeof(Resources.ResourceData), ErrorMessageResourceName = "EventName")]
    [MaxLength(80, ErrorMessageResourceType = typeof(Resources.ResourceData), ErrorMessageResourceName = "MaxLength")]
    [MinLength(8, ErrorMessageResourceType = typeof(Resources.ResourceData), ErrorMessageResourceName = "MinLength")]
    public string Name { get; set; }
    public Guid EventsCategoriesId { get; set; }
    [ForeignKey("EventsCategoriesId")]
    public EventsCategories EventsCategories { get; set; }
}

模型 2

public class EventsCategories
{
    public Guid Id { get; set; }
    [Required(ErrorMessageResourceType = typeof(Resources.ResourceData), ErrorMessageResourceName = "CategoryName")]
    [MaxLength(50, ErrorMessageResourceType = typeof(Resources.ResourceData), ErrorMessageResourceName = "MaxLength")]
    [MinLength(5, ErrorMessageResourceType = typeof(Resources.ResourceData), ErrorMessageResourceName = "MinLength")]
    public string Name { get; set; }
}

项目

DbContext
文件:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Events>()
           .Property(x => x.Id).HasDefaultValueSql("(newid())");

    builder.Entity<EventsCategories>()
           .Property(x => x.Id).HasDefaultValueSql("(newid())");
}

public DbSet<Events> events { get; set; }
public DbSet<EventsCategories> eventsCategories { get; set; }

IServicesRepository
文件:

public interface IServicesRepository<T> where T : class
{
    List<T> GetAll();
    T FindBy(Guid Id);
    bool Save(T model);
    bool Delete(Guid Id);
}

Services
事件文件:

public class ServicesEvents : IServicesRepository<Events>
{
    private readonly ProjectDBContext _context;

    public ServicesEvents(ProjectDBContext context)
    {
        _context = context;
    }

    public bool Delete(Guid Id)
    {
    }

    public Events FindBy(Guid Id)
    {
        try
        {
            return _context.events
                           .Include(x => x.EventsCategories)
                           .FirstOrDefault(x => x.Id.Equals(Id));
        }
        catch (Exception)
        {
            return null;
        }
    }

    public List<Events> GetAll()
    {
        try
        {
            return _context.events
                           .Include(x => x.EventsCategories)
                           .OrderBy(x => x.Name).ToList();
        }
        catch (Exception)
        {
            return null;
        }
    }

    public bool Save(Events model)
    {
        try
        {
            var result = FindBy(model.Id);

            if (result == null)
            {
                model.Id = Guid.NewGuid();
                _context.events.Add(model);
            }
            else
            {
                result.Name = model.Name;
                result.EventsCategoriesId = model.EventsCategoriesId;
                _context.events.Update(result);
            }

            _context.SaveChanges();

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
}

事件视图模型:

public class EventsViewModel
{
    public List<Events> events { get; set; }
    public Events NewEvents { get; set; }
}

事件控制器:

public class EventsController : Controller
{
    private readonly IServicesRepository<Events> servicesEvents;

    public EventsController(IServicesRepository<Events> servicesEvents)
    {
        this.servicesEvents = servicesEvents;
    }

    public IActionResult Events()
    {
        return View(new EventsViewModel
        {
            events = _servicesEvents.GetAll(),
            NewEvents = new Events()
        });
    }

    [HttpPost]
    [AutoValidateAntiforgeryToken]
    public IActionResult Save(EventsViewModel model)
    {
        if (ModelState.IsValid)
        {
            if (model.NewEvents.Id == Guid.Parse(Guid.Empty.ToString()))
            { 
                // Save
                if (_servicesEvents.FindBy(model.NewEvents.Name) != null)
                    SessionMsg.....;
                else
                {
                    if (_servicesEvents.Save(model.NewEvents))
                        SessionMsg......;
                    else
                        SessionMsg.......;
                }
            }
            else
            { 
                // Update
                if (_servicesEvents.Save(model.NewEvents))
                    SessionMsg..........;
                else
                    SessionMsg..........;;
            }
        }

        return RedirectToAction(nameof(Events));
    }
}

获取事件视图:

<table >
    <thead>
        <tr>
            <td>Name</td>
            <td>Category Id</td>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.events)
        {
            <tr>
                <td>
                    @item.Name
                </td>
                    @item.EventCategories.Id
                </td>
            </tr>
        }
    </tbody>
</table>

邮寄表格:

<form asp-action="Save" asp-controller="Events" method="post" enctype="multipart/form-data">
    <div class="form-group">
        <label asp-for="NewEvents.Name" class="control-label">Name</label>
        <input type="text" class="form-control" asp-for="NewEvents.Name" />
        <span asp-validation-for="NewEvents.Name" class="text-danger"></span>
    </div>

    <div class="form-group">
    <label asp-for="NewEvents.CategoryId" class="control-label">Category/label>
        <select class="custom-select-sm" asp-for="NewEvents.CategoryId" asp-items="@(new SelectList(Model.NewEvents.EventCategories,"Id","Name"))">
    <option value="">Category</option>
    </select>
    <span asp-validation-for="NewEvents.CategoryId" class="text-danger"></span>
    </div>
</form>

我正在尝试运行此代码,但总是出现错误或获取没有项目的列表

drop-down-menu asp.net-core-mvc selectlist
1个回答
0
投票

我正在尝试运行这段代码,但总是出现错误或没有得到列表 物品

实际上,根据您的视图,您的 EventsViewModel 定义不一致,导致错误或空数据。加载视图时没有看到您如何调用 eventsCategories 列表。

我没有使用您的存储库片段。因此,只是简化了快速演示的实现。您可以尝试以下方式:

事件视图模型:

public class EventsViewModel
    {
     
        public string Name { get; set; }
   
        public int EventsCategoriesId { get; set; }
        public IEnumerable<SelectListItem>? EventsCategories { get; set; }
    }

事件索引控制器动作:

public IActionResult Index()
        {
            EventsViewModel renterEventDropdown = new EventsViewModel()
            {
                EventsCategories = _context.Categories.Select(i => new SelectListItem
                {
                    Text = i.CategoryName,
                    Value = i.CategoryId.ToString()
                }),
            };
            return View(renterEventDropdown);
           
        }

注意: 获取事件类别,您可以设置 where 子句来实现外键约束过滤器。

景色:

@model YourProjectName.FolderName.EventsViewModel

<form asp-action="Save" method="post" enctype="multipart/form-data">
    <div class="form-group">
        <label asp-for="Name" class="control-label">Name</label>
        <input type="text" class="form-control" asp-for="Name" />
        <span asp-validation-for="Name" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="EventsCategoriesId" class="col-md-2 form-label"></label>
        <select asp-for="EventsCategoriesId" asp-items="@Model.EventsCategories" class="form-control">
            <option></option>
        </select>
        <span asp-validation-for="EventsCategoriesId" class="form-span-error"></span>
    </div>
    <br />

    <div class="form-group">
        <input type="submit" value="Submit " class="btn btn-primary" />
    </div>
</form>

输出:

注意:如果您想了解有关Select Tag Helper的更多详细信息,您可以在这里查看我们的官方文档。

© www.soinside.com 2019 - 2024. All rights reserved.