【发布时间】:2014-03-16 11:47:25
【问题描述】:
我是 C# MVC4 的 ViewModel 的新手,有一个问题我想了几天但找不到解决方案。 我想制作一个动态表,让用户可以编辑每一行,当用户点击“保存和更新”按钮时,viewModel 返回到控制器并将修改保存到数据库中。
这是我的视图模型:
我已经使用了存储库模式,并且我创建了一个服务层:
public class VigiprodView
{
public IEnumerable<Team> teams { get; set; }
public IEnumerable<Vigiprod> vigiprods { get; set; }
public IDictionary<TeamWeek, Vigiprod> vigiprodbyTeamWeek { get; set; }
public IDictionary<int, Week> weeks { get; set; }
public Vigiprod getVigrodByTeamAndWeek(Team team, Week week)
{ var key = new TeamWeek();
foreach (var k in vigiprodbyTeamWeek.Keys)
{
if ((team.teamId == k.teamId) && (week.weekId == k.weekId ))
{
key = k;
break;
}
}
return vigiprodbyTeamWeek[key];
}
}
public class TeamWeek
{
public int teamId { get; set; }
public int weekId { get; set; }
}
在我的服务中,我是这样写的:
public void saveVigiprodView(VigiprodView vigiprodView)
{
foreach (Week week in vigiprodView.weeks.Values)
{
this.prodStatusRepository.UpdateWeek(week);
}
foreach (Team team in vigiprodView.teams)
{
this.prodStatusRepository.updateTeam(team);
}
foreach (TeamWeek teamWeek in vigiprodView.vigiprodbyTeamWeek.Keys)
{
var teamWeekVigiprod = new TeamWeekVigiprod
{
vigiprod = teamWeek.teamId,
week = teamWeek.weekId,
team = teamWeek.teamId
};
this.prodStatusRepository.updateTeamWeekVigiprod(teamWeekVigiprod);
}
this.prodStatusRepository.Save();
}
在我的控制器中,我定义了一个编辑方法来将视图模型更改保存到数据库:
public class ProdStatusController : Controller
{
[HttpPost]
public ActionResult EditVigiprod(VigiprodView vigiprod)
{
try
{
var service = new ProdstatusService();
service.saveVigiprodView(vigiprod);
return RedirectToAction("EditVigiprod");
}
catch
{
return View("EditVigiprod", vigiprod);
}
}
}
好吧,在我看来,我已经成功正确地显示了表格,并且我已经编写了javascript来实现可编辑的功能。我想知道的是如何将视图中的“EditVigiprod”操作映射到控制器?这是我的观点:
@Model ProdStatus.Models.VigiprodView
@using (Html.BeginForm("Edit", "ProdStatus", Model, FormMethod.Post))
<input type="submit" name="Save" id="save" value="Save and update" />
<br>
<table id="itable" class="editableTable">
<thead>
<tr>
<th>
<div class="out"><b>Weeks</b> <em>Teams</em> </div>
</th>
@for (int key = 1; key <= 15; key++)
{
<th>
@Model.weeks[key].weekNumber
</th>
}
</tr>
</thead>
<tbody>
@foreach (var item in Model.teams)
{
<tr class="stats-row">
<td>
@item.teamName
</td>
@for (int key = 1; key <= 15; key++)
{
<td class="vigiprod">
@Model.getVigrodByTeamAndWeek(@item, @Model.weeks[key]).label
</td>
}
</tr>
}
</tbody>
</table>
在我看来,我尝试使用 BeginForm 将操作与控制器“绑定”,但是当我单击按钮时,数据库中没有任何变化,并且页面显示我找不到视图 EditVigiprod。我想知道如何将视图模型从视图返回到控制器。
非常感谢!!
【问题讨论】:
-
顺便说一句...您始终可以使每一行在单独的视图中可编辑...或为每行添加一个保存按钮...这样更容易将数据发送到服务器.
标签: c# asp.net-mvc-4 razor viewmodel repository-pattern