私はMVCアプリケーションを作成しています。私はその中にテーブルを持って、フォームを作成しています。テーブルにはユーザーとユーザーの成績が含まれていると想定されます(スクールでのマークシートなど)。マークを変更可能にしたいので、データベースのようにデフォルト値のTextBoxを作成しましたが、「Apply changes」ボタンを押すと、コントローラはすべてのマークのリストをnullとして表示します。それはなぜそうですか?
マイビュー(その一部):null値を返すMVCビュー
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@model ClassDeclarationsThsesis.Models.ClassesViewViewModel
@{
ViewBag.Title = "ClassesView";
}
<h2>ClassesView</h2>
<select id="sel">
<option value="week">Current week</option>
<option value="total">Total</option>
</select>
@{
int i = 0;
int inside = 0;
}
@using (Html.BeginForm("ClassesView", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
<div id="week">
<table border="1" width="500">
<tr>
<th>Surname</th>
<th>Name</th>
@foreach (var task in Model.current)
{
<th>@task.name</th>
}
<th>Total</th>
</tr>
@{
int counter = 0;
int counter1 = 0;
}
@foreach (var user in Model.curr_users)
{
if (user.user_type.Replace(" ", String.Empty) == 1.ToString())
{
<tr>
<th>@user.surname</th>
<th>@user.name</th>
@foreach (var task in Model.current)
{
foreach (var grade in Model.grading)
{
if (user.user_id == grade.user_id)
{
if (task.task_id == grade.task_id)
{
inside = task.value;
i = i + task.value;
counter1++;
}
}
}
<th>@Html.TextBoxFor(m => m.points[counter + counter1 - 1], new { @class = "form-control", @Value = @inside, style = "width:50px;" })</th>
inside = 0;
}
<th>
@i
</th>
@Html.HiddenFor(m => m.class_id)
@Html.HiddenFor(m => m.student_id)
</tr>
}
i = 0;
counter++;
}
</table>
<input type="submit" class="btn btn-default" value="Apply changes" />
</div>
}
points
私はここで使用ClassesViewViewModel
でList<int>
です。私は間違って何をしていますか?
EDIT:
は、コントローラを追加しました:
public ActionResult ClassesView(ClassesViewViewModel value)
{
ClassDeclarationsDBEntities4 entities = new ClassDeclarationsDBEntities4();
ClassesViewViewModel model = new ClassesViewViewModel();
model.users = entities.Users.ToList();
model.tasks = entities.Tasks.ToList();
model.group_id = value.group_id;
model.class_id = value.class_id;
model.grading = entities.Gradings.ToList();
model.s_u = entities.Subjects_Users.ToList();
model.t = new List<ClassDeclarationsThsesis.Classes.Task>();
model.current = new List<ClassDeclarationsThsesis.Classes.Task>();
model.curr_users = new List<ClassDeclarationsThsesis.Classes.User>();
DateTime max = DateTime.MinValue;
foreach (var task in model.tasks)
{
if (task.class_id == model.class_id)
{
model.t.Add(new ClassDeclarationsThsesis.Classes.Task(task.task_id, task.class_id, task.name, task.points, task.deadline));
}
}
foreach (var task in model.t)
{
if (DateTime.Compare(task.deadline, max) > 0)
{
max = task.deadline;
}
}
foreach (var task in model.t)
{
if (DateTime.Compare(task.deadline, max) == 0)
{
model.current.Add(task);
}
}
foreach (var s_u in model.s_u)
{
if (s_u.class_id == model.class_id && s_u.group_id == model.group_id)
{
foreach (var user in model.users)
{
if (user.user_id == s_u.user_id)
{
model.curr_users.Add(new ClassDeclarationsThsesis.Classes.User(user.name, user.surname, user.user_id, user.user_type, user.email, user.password));
}
}
}
}
if (ModelState.IsValid)
{
for(int i=0;i<model.points.Count();i++)
{
//getting null here
}
}
else
{
return View(model);
}
return View(model);
}
私たちにあなたのコントローラコードを教えてください。 – Yogi
@Yogi編集をご覧ください。 –
このコードではわかりにくいですが、索引が非順次的であるか、ゼロで始まらないことが考えられます。モデルバインディングを動作させるためには、リストインデックスはゼロで始まり、ギャップなしで連続していなければなりません。 – GSerg