C# NETMVC5如何在创建视图中创建列表?实体框架中的一对多关系
我希望能够有我的模型,在创建视图中可以编辑列表。这将是一对多的关系。例如: 如果我有可能为此人创建购物清单的客户模型,但清单也会有它的属性:C# NETMVC5如何在创建视图中创建列表?实体框架中的一对多关系,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我希望能够有我的模型,在创建视图中可以编辑列表。这将是一对多的关系。例如: 如果我有可能为此人创建购物清单的客户模型,但清单也会有它的属性: public class Client { public int ClientID {get; set} public string Name {get; set;} public virtual ICollection<Product> Product {get; set;} } public class Product { publi
public class Client
{
public int ClientID {get; set}
public string Name {get; set;}
public virtual ICollection<Product> Product {get; set;}
}
public class Product
{
public int ProductID {get; set;}
public int ClientID {get; set;}
public string ProductName {get; set;}
public string Description {get; set;}
public virtual Client Client {get; set;}
}
公共类客户端
{
public int ClientID{get;set}
公共字符串名称{get;set;}
公共虚拟ICollection产品{get;set;}
}
公共类产品
{
public int ProductID{get;set;}
public int ClientID{get;set;}
公共字符串ProductName{get;set;}
公共字符串说明{get;set;}
公共虚拟客户端{get;set;}
}
在“为客户创建视图”中,我想给他起个名字,并能够无限制地添加产品,之后我会让客户提供产品列表-保存他。
当然,然后我希望能够在详细信息视图中查看客户机的产品列表
最好的方法是什么?请注意:)最好的方法是实体框架和codefirst方法,我在下面的示例中介绍了这两种方法。 只有我在客户端类中做了一个小的更改,并将
产品
更改为产品
public class Client
{
public Client()
{
Products = new List<Product>();
}
public string Name {get; set;}
public virtual ICollection<Product> Products {get; set;}
}
实例
在本例中,仅我一人将数据添加到数据库中的控制器中,您必须在存储库层中执行此操作
你的模型
public class Client
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string ProductName { get; set; }
public string Description { get; set; }
public virtual Client Client { get; set; }
}
公共类客户端
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ID{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection产品{get;set;}
}
公共类产品
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ID{get;set;}
公共字符串ProductName{get;set;}
公共字符串说明{get;set;}
公共虚拟客户端{get;set;}
}
旅游环境
class yourContextName : DbContext
{
public yourContextName() : base("yourConnectionName")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Client>().Property(c => c.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Product>().Property(c => c.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
public DbSet<Client> Clients
{
get;
set;
}
public DbSet<Product> Products
{
get;
set;
}
}
classyourcontextname:DbContext
{
public yourContextName():base(“yourConnectionName”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Property(c=>c.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(c=>c.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
公共数据库集客户端
{
得到;
设置
}
公共数据库集产品
{
得到;
设置
}
}
你的控制器
[HttpGet]
public ActionResult AddProduct()
{
var client = new Client();
client.Name = "Client 1";
return View(client);
}
[HttpPost]
public ActionResult AddProduct(Client client, string[] ProductNames, string[] Descriptions)
{
client.Products = new List<Product>();
for(int i=0;i<ProductNames.Length;i++)
{
if(!string.IsNullOrEmpty(ProductNames[i]))
{
Product product = new Product() { Description =
Descriptions[i], ProductName = ProductNames[i] };
client.Products.Add(product);
}
}
//add data to database
db.Clients.Add(client);
db.SaveChanges();
return View(client);
}
[HttpGet]
公共行动结果AddProduct()
{
var client=new client();
client.Name=“client 1”;
返回视图(客户端);
}
[HttpPost]
public ActionResult AddProduct(客户端,字符串[]产品名称,字符串[]说明)
{
client.Products=新列表();
for(int i=0;i model.Name)
产品名称1:
@Html.TextBox(“ProductNames”,null)
产品说明1:
@文本框(“说明”,空)
添加产品
}
@节脚本{
$(文档).ready(函数(){
$(“#产品名称”).val(“”);
$(“#说明”).val(“”);
});
$('btnAddRow')。单击(函数(e){
e、 预防默认值();
var row=“
”;
$('#prItems')。追加(行);
orderRow();
})
函数删除程序(num){
$('prItems section')。每个(函数(idx){
if($(this).attr('num')==num){
$(this.remove();
}
});
orderRow();
}
函数orderRow(){
var rowCount=$('prItems section')。长度;
如果(行计数>0){
$('prItems section')。每个(函数(idx){
var num=idx+1;
$(this.attr('id','row'+num);
$(this.attr('num',num);
$(this).children().children().nextAll().slice(0,1).prev().text('Product Name'+num+“:”);
$(this.children().children().nextAll().slice(0,1).attr('name','ProductNames');
$(this).children().next().children().nextAll().slice(0,1).prev().text('Product Descr'+num+“:”);
$(this.children().next().children().nextAll().slice(0,1).attr('name','Descriptions');
$(this.children().next().next().slice(0,1.attr('onclick','removeRow('+num+')));
});
}
}
}
在您提供的解决方案中,您指定了5种产品。我希望这是灵活的,也许输入和旁边的加上按钮,这将添加新产品和明确的输入,所以我可以添加另一个产品。可能吗?您可以使用JavaScript或jQuery创建动态字段,并根据相同的模式将信息发送到操作。我进口了5种产品来澄清这个概念。你必须管理所有的活动。任何事情都可以做你有任何例子,帖子,可以帮助我做到这一点吗?请参阅此链接:
[HttpGet]
public ActionResult AddProduct()
{
var client = new Client();
client.Name = "Client 1";
return View(client);
}
[HttpPost]
public ActionResult AddProduct(Client client, string[] ProductNames, string[] Descriptions)
{
client.Products = new List<Product>();
for(int i=0;i<ProductNames.Length;i++)
{
if(!string.IsNullOrEmpty(ProductNames[i]))
{
Product product = new Product() { Description =
Descriptions[i], ProductName = ProductNames[i] };
client.Products.Add(product);
}
}
//add data to database
db.Clients.Add(client);
db.SaveChanges();
return View(client);
}
@model StackOverFlowMVC.Controllers.Client
@{
ViewBag.Title = "AddProduct";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>AddProduct</h2>
@using (Html.BeginForm("AddProduct", "Home", FormMethod.Post, new { id = "myform" }))
{
<label>Client Name : </label>
@Html.TextBoxFor(model => model.Name)
<br />
<hr />
<br />
<div id="prItems">
<section id="row1" num="1">
<div style="margin:10px;">
<label>Product Name 1 : </label>
@Html.TextBox("ProductNames",null)
</div>
<div style="margin:10px;">
<label>Product Descr 1 : </label>
@Html.TextBox("Descriptions", null)
</div>
<input type="button" class="RowDelete" value="-" onclick="removeRow(1)" />
<hr />
</section>
</div>
<button id="btnAddRow">Add Product</button>
<input type="submit" value="submit" id="btnsubmit" />
}
@section scripts{
<script>
$(document).ready(function () {
$('#ProductNames').val('');
$('#Descriptions').val('');
});
$('#btnAddRow').click(function (e) {
e.preventDefault();
var row = "<section><div style = 'margin:10px;'><label></label><input type='text'></div><div style='margin:10px;'><label></label><input type='text'></div><input type='button' class='RowDelete' value='-'/><hr /></section>";
$('#prItems').append(row);
orderRow();
})
function removeRow(num) {
$('#prItems section').each(function (idx) {
if ($(this).attr('num') == num) {
$(this).remove();
}
});
orderRow();
}
function orderRow() {
var rowCount = $('#prItems section').length;
if (rowCount > 0) {
$('#prItems section').each(function (idx) {
var num = idx + 1;
$(this).attr('id', 'row' + num);
$(this).attr('num', num);
$(this).children().children().nextAll().slice(0, 1).prev().text('Product Name ' + num + " : ");
$(this).children().children().nextAll().slice(0, 1).attr('name', 'ProductNames');
$(this).children().next().children().nextAll().slice(0, 1).prev().text('Product Descr ' + num + " : ");
$(this).children().next().children().nextAll().slice(0, 1).attr('name', 'Descriptions');
$(this).children().next().next().slice(0, 1).attr('onclick', 'removeRow(' + num + ')');
});
}
}
</script>
}