C# 如何将视图更改映射到数据库MVC4

C# 如何将视图更改映射到数据库MVC4,c#,asp.net-mvc-4,razor,viewmodel,repository-pattern,C#,Asp.net Mvc 4,Razor,Viewmodel,Repository Pattern,我是MVC4的ViewModel新手,有一个问题我已经思考了好几天,但我找不到解决方案。 我想创建一个动态表,使用户可以编辑每一行,当用户单击“保存并更新”按钮时,viewModel将返回控制器并将修改保存到数据库 这是我的viewmodel: 我使用了存储库模式,并创建了一个服务层: public class VigiprodView { public IEnumerable<Team> teams { get; set; } public IEnumerable&

我是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; }
    }
在我的控制器中,我定义了一种编辑方法来将viewmodel更改保存到数据库:

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
@使用Html.BeginFormEdit、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。我想知道如何将viewmodel从视图返回到控制器

非常感谢

这里有几个问题

要将视图中的数据发送到服务器控制器的操作,您有2个选项:

您需要使用表单元素包装所有视图标记。这个可以 使用BeginForm或AjaxForm完成。在本例中,数据 发布到控制器,需要输入。在你看来,你 不要使用任何输入,所以。。。不会发布任何内容

另一个选项是使用javascript完成post。这不会 需要输入,您只需在按钮clic上运行一个javascript函数 威尔:获取视图中要发送给控制器的所有值,wrap 它和做表格张贴

这样想更容易:我希望在控制器操作中接收的所有信息都需要显示在视图中并放置在输入中。如果不希望数据可见,输入可以是文本框、下拉列表或隐藏列表。当您来自ASP.NET WebForms,在那里,字段的值在ViewState中来回保留时,这需要改变想法。默认情况下,MVC是无状态的


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

Nope。。。一旦进入你的客户,你就不再有模型了。。。您需要从HTML中获取值。因此,您需要使用JSON重新创建视图模型,而不是JSON.stringifyvigiprodViewModel。在这里,您将注意到不需要再次发布所有这些数据。可能只是一个id和值的集合。请记住,你编辑得到和编辑后可以收到不同的模型。顺便说一句。。。您始终可以使每一行在单独的视图中可编辑。。。或者为每行添加一个保存按钮。。。这样更容易将数据发送到服务器。
<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>