У меня есть вид, который содержит n полей ввода (количество будет варьироваться в зависимости от разных критериев). значение каждого поля ввода должно быть вставлено в базу данных в отдельной строке. Моя проблема в том, что в базу данных вставляется только первое поле ввода. Контроллер выглядит так:
public ActionResult Create([Bind(Include = "Id,MemberId,Rated,Rating")] Rating rating)
{
if (ModelState.IsValid)
{
db.Ratings.Add(rating);
db.SaveChanges();
}
Значение MemberId одинаково для каждой строки, но Rated и Rating будут отличаться.
Моя модель выглядит так:
[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");
}
И мой вид:
@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>
}
Это достаточно просто, но я чувствую, что есть лучший, более чистый способ. Есть предложения?