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>
}