我有 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>
我正在尝试运行此代码,但总是出现错误或获取没有项目的列表
我正在尝试运行这段代码,但总是出现错误或没有得到列表 物品
实际上,根据您的视图,您的 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的更多详细信息,您可以在这里查看我们的官方文档。