MVC批量编辑 - Linq to Sql列表保存

7
为了更好地理解MVC和Linq to SQL的基础知识,我正在对Stephen Walther的TaskList应用程序进行改编:(链接)。我正在使用Steve Sanderson博客中描述的概念添加批量编辑系统。(链接)。这一切都按预期工作,但是我在保存返回的任务列表时遇到了麻烦。我的BulkEdit视图继承了ViewPage<List<TaskList.Models.Task>>,如下所示:
<% 
using (Html.BeginForm())
{
%>
        <div id="items">

<%
            foreach (var task in ViewData.Model)
            {
                Html.RenderPartial(
                    "TaskEditor",
                    task,
                    new ViewDataDictionary(ViewData)
                            {
                                {"prefix", "tasks"}
                            }
                );
            }
%>

        </div>

        <input type="submit" value="Save changes" />

<%
    }
%>

TaskEditor控件继承了System.Web.Mvc.ViewUserControl<Models.Task>,并且长这样:

<div>
<%= Html.Hidden(ViewData["prefix"] + ".index", ViewData.Model.Id) %>

<% var fieldPrefix = string.Format("{0}[{1}].", ViewData["prefix"], ViewData.Model.Id); %>

<%= Html.Hidden(fieldPrefix + "Id", ViewData.Model.Id) %>
Description:
<%= Html.TextBox(fieldPrefix + "TaskDescription", ViewData.Model.TaskDescription)%>
Date:
<%= Html.TextBox(fieldPrefix + "EntryDate", ViewData.Model.EntryDate.ToString("o"))%>   
Completed:
<%= Html.CheckBox(fieldPrefix + "IsCompleted", ViewData.Model.IsCompleted)%>
</div>

控制器的Get和Post方法如下:
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult BulkEdit()
    {
        var tasks = from t in db.Tasks orderby t.EntryDate descending select t;

        return View(tasks.ToList());
    }        

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult BulkEdit(IList<Task> tasks)
    {
        foreach(Task task in tasks)
        {
            foreach(Task dbTask in db.Tasks)
            {
                if (dbTask.Id == task.Id)
                {
                    dbTask.TaskDescription = task.TaskDescription;
                    dbTask.EntryDate = task.EntryDate;
                    dbTask.IsCompleted = task.IsCompleted;
                }
            }
        }

        db.SubmitChanges();

        return RedirectToAction("Index");
    }

我的问题是,这似乎太复杂了,我还没有考虑到任务从列表中被添加或删除的情况。我更希望做的是类似于:

db.Tasks = tasks;

我希望使用Linq来完成所有魔法,以便确定哪些已更改,哪些是新的/旧的。

这个可能吗?或者我对Linq期望过高了吗?

2个回答

3
您正在处理LINQ to SQL没有多层故事的事实。我认为这就是您要寻找的内容:http://blog.irm.se/blogs/eric/archive/2008/08/20/Go-Distributed-With-LINQ-to-SQL.aspx。该作者介绍的Merge方法可以很容易地转换成DataContext类的“扩展方法”,并且几乎就像它是直接内置到LINQ to SQL中一样。我说几乎是因为您必须包括扩展方法所在的命名空间才能使用它。

0

我认为你应该考虑使用视图来实现你想要的功能。使用ObservebleCollection集合来保存项目,然后你可以在列表中绑定到该集合的视图,你仍然需要处理添加和删除项目的情况,但你也可以选择IBindingList,它将给你一个BindingListCollectionView,它将更新数据库,你只需要调用视图的AddNew() CommitNew()等方法即可。

希望对你有所帮助, Eric


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接