[英]How to bind the SharePoint 2013 list data to a dropdown list in a gridview of asp.net using csom
[英]How to bind data from dropdown list in asp.net core
我是asp.net核心的新手,并尝试使用实体框架开发教育项目(电子商店)。 我在模型绑定方面遇到了一些问题。 我有 2 个模型:产品和类别。
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public Category Category { get; set; }
public decimal Price { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
产品控制器:
[HttpGet]
public IActionResult Create()
{
ViewBag.Categories = new SelectList(categoryRepo.Categories, "Id", "Name");
return View("Edit", new Product());
}
[HttpGet]
public IActionResult Edit(int productId)
{
return View(repo.Products.FirstOrDefault(p => p.Id == productId));
}
[HttpPost]
public IActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
repo.SaveProduct(product);
TempData["Message"] = $"{product.Title} successfully saved";
return RedirectToAction("Index");
}
else
{
ViewBag.Categories = new SelectList(categoryRepo.Categories, "Id", "Name");
return View(product);
}
}
ProductController 中的 Create 方法一切正常,并将类别添加到 Edit.cshtml 中的下拉列表
@model Product
@{
ViewData["Title"] = "Add product";
}
<h1>@ViewData["Title"]</h1>
<form asp-action="Edit" asp-controller="Product" method="post">
<div class="form-group">
<label asp-for="Title"></label>
<div>
<span class="text-danger" asp-validation-for="Title"></span>
</div>
<input class="form-control" type="text" asp-for="Title" />
</div>
<div class="form-group">
<label asp-for="Description"></label>
<div>
<span class="text-danger" asp-validation-for="Description"></span>
</div>
<textarea class="form-control" asp-for="Description" cols="15" rows="10"></textarea>
</div>
<div class="form-group">
<label asp-for="Category"></label>
<div>
<span class="text-danger" asp-validation-for="Category"></span>
</div>
<select asp-for="Category" asp-items="ViewBag.Categories">
<option disabled>Choose the category</option>
</select>
</div>
<div class="form-group">
<label asp-for="Price"></label>
<div>
<span class="text-danger" asp-validation-for="Price"></span>
</div>
<input class="form-control" type="text" asp-for="Price" />
</div>
<button class="btn btn-success" type="submit">Add</button>
</form>
但是,当我尝试将表单提交回 ProductController.cs 中的 Edit 方法时,Category 字段未绑定到 Product 并且我只收到验证错误“选择类别”。
请帮我解决这个问题!
PS数据库上下文:
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options){ }
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
IProductRepository 的实现
public class EFProductRepository : IProductRepository
{
private AppDbContext context;
public EFProductRepository(AppDbContext ctx)
{
context = ctx;
}
public IQueryable<Product> Products => context.Products.Include(p => p.Category);
public void SaveProduct(Product product)
{
if (product.Id == 0)
{
context.Products.Add(product);
}
else
{
Product entry = context.Products.FirstOrDefault(p => p.Id == product.Id);
if (entry != null)
{
entry.Title = product.Title;
entry.Description = product.Description;
entry.Category = product.Category;
entry.Price = product.Price;
}
}
context.SaveChanges();
}
}
ICategoryRepository 的实现
public class EFCategoryRepository : ICategoryRepository
{
private AppDbContext context;
public EFCategoryRepository(AppDbContext ctx)
{
context = ctx;
}
public IQueryable<Category> Categories => context.Categories;
}
您必须在产品中添加 CategoryId 对象,因此您的产品类应该是
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int CategoryId {get;set;}
public Category Category { get; set; }
public decimal Price { get; set; }
}
在您的视图页面中,类别选择元素应该在 asp-for 属性中使用 CategoryId 而不是 Category 它应该像
<select asp-for="CategoryId" asp-items="ViewBag.Categories"></select>
修复动作的 ViewBag.Categories
ViewBag.Categories = categoryRepo.Categories
.Select( i=> new SelectListItem {
Value=i.Id.ToString(),
Text=i.Name
}).ToList();
将 CategoryId 添加到 Product 类,并检查您的 Product fluent APIs。 产品中不应该有任何关于所需类别的内容,将所有内容更改为 CategoryId。
public class Product
{
...
public int? CategoryId {get;set;}
public virtual Category Category { get; set; }
....
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products {get; set;}
}
并修复视图
<select asp-for="CategoryId" asp-items="ViewBag.Categories"></select>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.