Массовое редактирование MVC - Linq to Sql List Сохранить - PullRequest
7 голосов
/ 03 февраля 2009

Чтобы разобраться с некоторыми основами использования MVC и Linq to SQL, я работаю над адаптацией к приложению Стивена Вальтера TaskList :

Я добавляю систему Bulk Edit, используя понятия, описанные в Блог Стива Сандерсона .

Это все работает, как и ожидалось, однако у меня возникли проблемы с сохранением возвращенного списка задач. Сообщение в мой 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<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>

Методы 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 сделать всю свою магию, чтобы выяснить, какие из них изменились, а какие новые / старые.

Возможно ли это? Или я ожидаю слишком много от Линка так скоро?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2009

Вы имеете в виду тот факт, что 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 голосов
/ 03 февраля 2009

Я думаю, вам следует подумать об использовании представления для достижения того, чего вы хотите. коллекция ObservebleCollection для хранения элементов, и тогда вы можете иметь привязку в своем списке к представлению этой коллекции, вам все равно придется обрабатывать случаи добавления и удаления элементов, но вы также можете выбрать IBindingList, который даст вам BindingListCollectionView, который будет обновлять БД, все, что вам нужно сделать, это вызвать представления AddNew () CommitNew () и т. д.

НТН, Eric

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...