C# 如何从一篇文章中插入多行

C# 如何从一篇文章中插入多行,c#,mysql,asp.net-mvc,C#,Mysql,Asp.net Mvc,我有一个包含n个输入字段的视图(数量会根据不同的标准而变化)。每个输入字段的值都需要插入数据库中它们自己的行中。 我的问题是,只有第一个输入字段被插入到数据库中。控制器如下所示: public ActionResult Create([Bind(Include = "Id,MemberId,Rated,Rating")] Rating rating) { if (ModelState.IsValid) {

我有一个包含n个输入字段的视图(数量会根据不同的标准而变化)。每个输入字段的值都需要插入数据库中它们自己的行中。 我的问题是,只有第一个输入字段被插入到数据库中。控制器如下所示:

public ActionResult Create([Bind(Include = "Id,MemberId,Rated,Rating")] Rating rating)
        {
                if (ModelState.IsValid)
                {
                    db.Ratings.Add(rating);
                    db.SaveChanges();                  
                }
[Table("Rating")]
    public partial class Rating
    {
        public int Id { get; set; }

        public int? MemberId { get; set; }

        public int Rated { get; set; }

        [Column("Rating")]
        public int Rating { get; set; }

        public virtual TeamMember TeamMember { get; set; }
    }
@model Teamer.Models.Rating

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Rating</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @{
                int count = 0;

                foreach (var item in ViewBag.MemberId)
                {
                    string rater = Request.Cookies["rater"]["name"].ToString();
                    string raterId = Request.Cookies["rater"]["raterId"];

                    if (item.Name.ToLower() != rater.ToLower())
                    {
                        if (ViewBag.raterId != null)
                        {
                            foreach (var raterid in ViewBag.raterId)
                            {
                                <input type="hidden" name="MemberId" value="@raterid" />
                            }
                        }
                        <div class="col-md-10">
                            <label class="control-label col-md-2" for="@item.Name">@item.Name</label>
                            <input type="number" name="Rating-@count" value="0" />
                            <input type="hidden" name="Rated" value="@item.Id" />
                        </div>  
                        count++;
                    }
                }
            }
        </div>

        <input type="hidden" name="count" value="@count" />

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}
public ActionResult Create(Rating rating)
        {
            int count = int.Parse(Request.Form["count"]);

            for (int i = 0; i < count; i++)
            {
                string test = Request.Form["MemberId"];
                rating.MemberId = int.Parse(test);
                rating.Rated = int.Parse(Request.Form["Rated-" + i]);
                rating.Rating1 = int.Parse(Request.Form["Rating1-" + i]);
                db.Ratings.Add(rating);

                if (ModelState.IsValid)
                {
                    db.SaveChanges();
                }
            }

            return RedirectToAction("Index");

        }
MemberId的值对于每一行都是相同的,但Rated和Rating将不同

我的模型如下所示:

public ActionResult Create([Bind(Include = "Id,MemberId,Rated,Rating")] Rating rating)
        {
                if (ModelState.IsValid)
                {
                    db.Ratings.Add(rating);
                    db.SaveChanges();                  
                }
[Table("Rating")]
    public partial class Rating
    {
        public int Id { get; set; }

        public int? MemberId { get; set; }

        public int Rated { get; set; }

        [Column("Rating")]
        public int Rating { get; set; }

        public virtual TeamMember TeamMember { get; set; }
    }
@model Teamer.Models.Rating

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Rating</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @{
                int count = 0;

                foreach (var item in ViewBag.MemberId)
                {
                    string rater = Request.Cookies["rater"]["name"].ToString();
                    string raterId = Request.Cookies["rater"]["raterId"];

                    if (item.Name.ToLower() != rater.ToLower())
                    {
                        if (ViewBag.raterId != null)
                        {
                            foreach (var raterid in ViewBag.raterId)
                            {
                                <input type="hidden" name="MemberId" value="@raterid" />
                            }
                        }
                        <div class="col-md-10">
                            <label class="control-label col-md-2" for="@item.Name">@item.Name</label>
                            <input type="number" name="Rating-@count" value="0" />
                            <input type="hidden" name="Rated" value="@item.Id" />
                        </div>  
                        count++;
                    }
                }
            }
        </div>

        <input type="hidden" name="count" value="@count" />

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}
public ActionResult Create(Rating rating)
        {
            int count = int.Parse(Request.Form["count"]);

            for (int i = 0; i < count; i++)
            {
                string test = Request.Form["MemberId"];
                rating.MemberId = int.Parse(test);
                rating.Rated = int.Parse(Request.Form["Rated-" + i]);
                rating.Rating1 = int.Parse(Request.Form["Rating1-" + i]);
                db.Ratings.Add(rating);

                if (ModelState.IsValid)
                {
                    db.SaveChanges();
                }
            }

            return RedirectToAction("Index");

        }
视图如下所示:

public ActionResult Create([Bind(Include = "Id,MemberId,Rated,Rating")] Rating rating)
        {
                if (ModelState.IsValid)
                {
                    db.Ratings.Add(rating);
                    db.SaveChanges();                  
                }
[Table("Rating")]
    public partial class Rating
    {
        public int Id { get; set; }

        public int? MemberId { get; set; }

        public int Rated { get; set; }

        [Column("Rating")]
        public int Rating { get; set; }

        public virtual TeamMember TeamMember { get; set; }
    }
@model Teamer.Models.Rating

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Rating</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @{
                int count = 0;

                foreach (var item in ViewBag.MemberId)
                {
                    string rater = Request.Cookies["rater"]["name"].ToString();
                    string raterId = Request.Cookies["rater"]["raterId"];

                    if (item.Name.ToLower() != rater.ToLower())
                    {
                        if (ViewBag.raterId != null)
                        {
                            foreach (var raterid in ViewBag.raterId)
                            {
                                <input type="hidden" name="MemberId" value="@raterid" />
                            }
                        }
                        <div class="col-md-10">
                            <label class="control-label col-md-2" for="@item.Name">@item.Name</label>
                            <input type="number" name="Rating-@count" value="0" />
                            <input type="hidden" name="Rated" value="@item.Id" />
                        </div>  
                        count++;
                    }
                }
            }
        </div>

        <input type="hidden" name="count" value="@count" />

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}
public ActionResult Create(Rating rating)
        {
            int count = int.Parse(Request.Form["count"]);

            for (int i = 0; i < count; i++)
            {
                string test = Request.Form["MemberId"];
                rating.MemberId = int.Parse(test);
                rating.Rated = int.Parse(Request.Form["Rated-" + i]);
                rating.Rating1 = int.Parse(Request.Form["Rating1-" + i]);
                db.Ratings.Add(rating);

                if (ModelState.IsValid)
                {
                    db.SaveChanges();
                }
            }

            return RedirectToAction("Index");

        }
@model Teamer.Models.Rating
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
评级

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @{ 整数计数=0; foreach(ViewBag.MemberId中的变量项) { string rater=Request.Cookies[“rater”][“name”].ToString(); 字符串raterId=Request.Cookies[“rater”][“raterId”]; if(item.Name.ToLower()!=rater.ToLower()) { 如果(ViewBag.raterId!=null) { foreach(ViewBag.raterid中的var raterid) { } } @项目名称 计数++; } } } }
我猜,我需要一个接一个地循环这些值,但我无法让它们工作,所以我可能离这太远了

编辑

好的,我现在用简单的,虽然可能有点难看的解决方案。 我的控制器现在看起来像这样:

public ActionResult Create([Bind(Include = "Id,MemberId,Rated,Rating")] Rating rating)
        {
                if (ModelState.IsValid)
                {
                    db.Ratings.Add(rating);
                    db.SaveChanges();                  
                }
[Table("Rating")]
    public partial class Rating
    {
        public int Id { get; set; }

        public int? MemberId { get; set; }

        public int Rated { get; set; }

        [Column("Rating")]
        public int Rating { get; set; }

        public virtual TeamMember TeamMember { get; set; }
    }
@model Teamer.Models.Rating

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Rating</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

        <div class="form-group">
            @{
                int count = 0;

                foreach (var item in ViewBag.MemberId)
                {
                    string rater = Request.Cookies["rater"]["name"].ToString();
                    string raterId = Request.Cookies["rater"]["raterId"];

                    if (item.Name.ToLower() != rater.ToLower())
                    {
                        if (ViewBag.raterId != null)
                        {
                            foreach (var raterid in ViewBag.raterId)
                            {
                                <input type="hidden" name="MemberId" value="@raterid" />
                            }
                        }
                        <div class="col-md-10">
                            <label class="control-label col-md-2" for="@item.Name">@item.Name</label>
                            <input type="number" name="Rating-@count" value="0" />
                            <input type="hidden" name="Rated" value="@item.Id" />
                        </div>  
                        count++;
                    }
                }
            }
        </div>

        <input type="hidden" name="count" value="@count" />

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}
public ActionResult Create(Rating rating)
        {
            int count = int.Parse(Request.Form["count"]);

            for (int i = 0; i < count; i++)
            {
                string test = Request.Form["MemberId"];
                rating.MemberId = int.Parse(test);
                rating.Rated = int.Parse(Request.Form["Rated-" + i]);
                rating.Rating1 = int.Parse(Request.Form["Rating1-" + i]);
                db.Ratings.Add(rating);

                if (ModelState.IsValid)
                {
                    db.SaveChanges();
                }
            }

            return RedirectToAction("Index");

        }
公共行动结果创建(评级)
{
int count=int.Parse(Request.Form[“count”]);
for(int i=0;i
我的看法是:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Rating</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-group">
        @{
            int count = 0;
            string raterId = Request.Cookies["rater"]["raterId"];
            foreach (var item in ViewBag.MemberId)
            {
                string rater = Request.Cookies["rater"]["name"].ToString();


                if (item.Name.ToLower() != rater.ToLower())
                {

                    <div class="col-md-10">
                        <label class="control-label col-md-2" for="@item.Name">@item.Name</label>
                        <input type="number" name="Rating1-@count" value="0" />
                        <input type="hidden" name="Rated-@count" value="@item.Id" />
                    </div>

                    count++;
                }

            }
        }
    </div>

    <input type="hidden" name="MemberId" value="@raterId" />

    <input type="hidden" name="count" value="@count" />

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
评级

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @{ 整数计数=0; 字符串raterId=Request.Cookies[“rater”][“raterId”]; foreach(ViewBag.MemberId中的变量项) { string rater=Request.Cookies[“rater”][“name”].ToString(); if(item.Name.ToLower()!=rater.ToLower()) { @项目名称 计数++; } } } }

这很简单,但我觉得有更好更干净的方法。有什么建议吗?

我可以看到一些问题,但最后,您没有发布控制器期望的内容。您的控制器希望获得
评级
(因此Id、MemberId、Rated和Rating),但实际上您发布的内容类似于

MemberId=raterId (repeated by as many ViewBag.raterId you have)
Rating-0=0
Rated=memberX_Id
Rating-1=0
Rated=memberY_Id
Rating-2=0
Rated=memberZ_Id
(...)
Rating-n=0
Rated=memberM_Id
count=(n+1)
MemberId[0]=
Rated[0]=
Rating[0]=
MemberId[1]=
Rated[1]=
Rating[1]=
(...)
MemberId[n]=
Rated[n]=
Rating[n]=
如果你检查你发布的数据,你应该只填写MemberId和Rated

为了实现您想要的,您需要在控制器端有一个
评级列表
或一个不同的结构。记住,如果你想发布一个数组,它应该是

MemberId=raterId (repeated by as many ViewBag.raterId you have)
Rating-0=0
Rated=memberX_Id
Rating-1=0
Rated=memberY_Id
Rating-2=0
Rated=memberZ_Id
(...)
Rating-n=0
Rated=memberM_Id
count=(n+1)
MemberId[0]=
Rated[0]=
Rating[0]=
MemberId[1]=
Rated[1]=
Rating[1]=
(...)
MemberId[n]=
Rated[n]=
Rating[n]=

另外,请注意,在循环中重写MemberId和Rated

客户端正在向控制器发送数组,需要修改绑定。控制器应接受
评级的数组或集合

   public ActionResult Create(Icollection<Rating> ratings)
   {
       if (ModelState.IsValid)
       {
        //saving...              
       }
    }
不要忘记改变观点:

<div class="col-md-10">
   <input type="hidden" name="MemberId" value="@raterId" />
   <input type="number" name="Rate" value="0" />
 </div>

Asp.net MVC中的绑定工作原理如下:将html
name
属性关联到C#code中的
property
name。 要知道另一个程序员希望他的代码做什么相当复杂,但关键是:

  • 使用
    Model
  • 注意绑定是如何工作的
  • 用Dto替换实体
  • 使用调试器(Google Chrome、Firefox等)检查您发送的内容 浏览

希望有帮助。

您也可以发布视图吗?你试过作为列表吗?只有Rating将只返回表单的第一个元素。@MonkeyDLuffy添加列表在db.Ratings.Add(Rating)上给出了一个错误;-“无法从‘System.Collections.generics.List…’转换为‘Rate.Models.Rating’@Lasserh当您尝试循环时发生了什么,您能显示代码吗?@DanChase当我调试时,它似乎是我的请求。表单包含列表。当我尝试更新例如Rating.Rated时,我得到一个‘输入字符串格式不正确’-错误-这是有意义的。”,我想,因为它不仅仅是一个int,而是一个完整的列表。我真的不知道如何处理输入,以将它们分开并分别对待。在这个@Lasserh上运气好吗?谢谢你的输入。这会导致评级为空-因此没有插入任何内容。@Lasserh,sepehr ir右键指向“列表”“在控制器方面,但这还不够。为了发布阵列/集合,您还应该更新前端。有关如何发布数组的更多详细信息,请查看我的答案,但请记住代码中还有其他问题。