C# 如何从一篇文章中插入多行
我有一个包含n个输入字段的视图(数量会根据不同的标准而变化)。每个输入字段的值都需要插入数据库中它们自己的行中。 我的问题是,只有第一个输入字段被插入到数据库中。控制器如下所示: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) {
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中的绑定工作原理如下:将htmlname
属性关联到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右键指向“列表”“在控制器方面,但这还不够。为了发布阵列/集合,您还应该更新前端。有关如何发布数组的更多详细信息,请查看我的答案,但请记住代码中还有其他问题。