如何将视图更改映射到数据库MVC 4
本文关键字:数据库 MVC 映射 视图 | 更新日期: 2023-09-27 17:50:33
我是c# MVC4的ViewModel的新手,有一个问题,我已经思考了好几天,但我找不到解决方案。我想做一个动态表,使用户能够编辑每一行,当用户单击"保存和更新"按钮时,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();
}
在我的控制器中,我定义了一个Edit方法来保存视图模型更改到数据库:
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。我想知道如何从视图返回视图模型到控制器。
非常感谢!
这里有几个问题…
发送数据从你的视图到服务器(你的控制器的动作),你有2个选项:
-
您需要用FORM元素包装所有视图标记。这可以可以用BeginForm或AjaxForm完成。在本例中,是数据张贴到你的控制器,需要在输入。在你看来,你不要使用任何输入,所以…
-
另一个选择是使用javascript做post。这不会需要输入,你只需要在button clic上运行一个javascript函数将获取视图中的所有值并发送给控制器
这样想更容易:我想在Controller Action中接收的所有信息都需要出现在视图中并放置在输入中。输入可以是TextBox, DropDownList或Hidden,如果你不想让数据可见。当您来自ASP时,这需要改变思想。NET WebForms中,字段的值在ViewState中来回持久化。MVC默认是无状态的。
因此,这将迫使您尝试只发布所需的值,而不是视图中的所有信息。有时候,你只需要发布一个模特的ID…不是所有的属性,因为你可以在控制器中使用ID从数据库中获取这些属性。