Чтобы разобраться с некоторыми основами использования 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 сделать всю свою магию, чтобы выяснить, какие из них изменились, а какие новые / старые.
Возможно ли это? Или я ожидаю слишком много от Линка так скоро?