如何将视图更改映射到数据库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。我想知道如何从视图返回视图模型到控制器。

非常感谢!

如何将视图更改映射到数据库MVC 4

这里有几个问题…

发送数据从你的视图到服务器(你的控制器的动作),你有2个选项:

  1. 您需要用FORM元素包装所有视图标记。这可以可以用BeginForm或AjaxForm完成。在本例中,是数据张贴到你的控制器,需要在输入。在你看来,你不要使用任何输入,所以…

  2. 另一个选择是使用javascript做post。这不会需要输入,你只需要在button clic上运行一个javascript函数将获取视图中的所有值并发送给控制器

这样想更容易:我想在Controller Action中接收的所有信息都需要出现在视图中并放置在输入中。输入可以是TextBox, DropDownList或Hidden,如果你不想让数据可见。当您来自ASP时,这需要改变思想。NET WebForms中,字段的值在ViewState中来回持久化。MVC默认是无状态的。

因此,这将迫使您尝试只发布所需的值,而不是视图中的所有信息。有时候,你只需要发布一个模特的ID…不是所有的属性,因为你可以在控制器中使用ID从数据库中获取这些属性。