【问题标题】:How to map view changes to the database MVC 4如何将视图更改映射到数据库 MVC 4
【发布时间】: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


【解决方案1】:

这里有几个问题...

要将数据从您的视图发送到服务器(您的控制器的操作),您有两种选择:

  1. 您需要使用 FORM 元素包装所有视图标记。这个可以 使用 BeginForm 或 AjaxForm 完成。在这种情况下,数据 发布到您的控制器,需要在输入中。在你看来,你 不要使用任何输入,所以...不会发布任何内容。

  2. 另一种选择是使用 javascript 发布帖子。这不会 需要输入,您只需在按钮 clic 上运行一个 javascript 函数,即 will:获取视图中的所有值发送到控制器,换行 它并进行表单发布。

这样想更容易:我想在我的控制器动作中接收的所有信息都需要出现在视图中并放置在输入中。如果您不希望数据可见,输入可以是 TextBox、DropDownList 或 Hidden。当您来自 ASP.NET WebForms 时,这需要改变主意,因为您在 ViewState 中来回保存字段的值。 MVC 默认是无状态的。

因此,这将迫使您尝试仅发布所需的值,而不是视图中的所有信息。有时,您需要发布的只是模型的 ID...不是所有属性,因为您可以使用 ID 在 Controller 中从数据库中获取这些属性。

【讨论】:

  • 不...一旦在您的客户端中,您就没有模型了...您需要从 HTML 中获取值。因此,您需要使用 JSON 重新创建您的视图模型,而不是“JSON.stringify(vigiprodViewModel)”。在这里您会注意到您不需要再次发布所有这些数据。可能只是 id 和 value 的集合。请记住,您的 Edit (Get) 和 Edit (Post) 可以接收不同的模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多