【问题标题】:MVC Bulk Edit - Linq to Sql List SaveMVC 批量编辑 - Linq to Sql 列表保存
【发布时间】:2009-02-03 08:44:52
【问题描述】:

为了了解一些使用 MVC 和 Linq to SQL 的基础知识,我正在对 Stephen Walther 的 TaskList application 进行改编:

我正在使用Steve Sanderson's blog 中描述的概念添加批量编辑系统。

这一切都按预期工作,但是,我无法保存返回的任务列表。 Post to my BulkEdit 循环遍历返回的列表并更新我的 LinqToSql db 任务列表中的每个项目。

我的 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&lt;Models.Task&gt;,如下所示:

<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>

Controller 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 期望过高了?

【问题讨论】:

    标签: c# asp.net-mvc linq linq-to-sql


    【解决方案1】:

    您正在处理的事实是 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 中一样。我说几乎是因为您必须包含扩展方法所在的名称空间才能使用它。

    【讨论】:

      【解决方案2】:

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

      HTH, 埃里克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多