2009-08-14 3 views
1

Есть ли готовый ModelBinder, который я могу использовать с LINQ, чтобы получить объект из DataContext и обновить его на HTTP-сообщении?ASP.NET MVC, LINQ и ModelBinders

К примеру, в настоящее время у меня есть этот блок кода:

[AcceptVerbs (HttpVerbs.Post)] 
public ActionResult Edit (Project project) 
{ 
    var projectService = Factory.GetService<IProjectService>(); 
    project = projectService.GetProject (project.ProjectId); 

    UpdateModel<Project> (project); 

    if (!ModelState.IsValid) 
     return View (project); 

    project = projectService.SaveProject (project); 

    return RedirectToAction ("Details", new { id = project.ProjectId }); 
} 

(IProjectService оборачивает вызовы в контексте данных LINQ)

Для того, чтобы фактически выполнить обновление базы данных с помощью LINQ данных, мне нужно снова получить экземпляр проекта, а затем обновить этот экземпляр.

Любая попытка простого сохранения экземпляра проекта без предварительного получения из контекста данных приводит к тому, что ничего не записывается в базу данных - я предполагаю, что контекст данных LINQ ничего не знает об объекте, который он ничего не делает с этим.

Использование метода Attach в классе Table Projects не работает ни btw, но и создает исключение.

ответ

3

Вы должны смотреть на реализацию в (новом BSD) Майк Hadlow в SutekiShop.

Здесь вы найдете DataBindAttribute и BindUsingAttribute, которые, если я правильно понимаю, сделают именно то, что вы хотите сделать. Обратите внимание, как свойство DataBindAttribute.Fetch используется для повторной пересылки входящих данных или нет (из HttpPost) в объект LINQ.

Я следил за этим шаблоном для одного из моих проектов с использованием ASP.NET MVC и LINQ-To-SQL. Он работает красиво.

Вот источник: http://www.google.com/codesearch?hl=en&lr=&q=DataBind+package%3Ahttp%3A%2F%2Fsutekishop.googlecode.com&sbtn=Search

+0

Вот именно, спасибо, Роберт! – Kieron

+0

SutekiShop имеет много отличного кода, рад, что он работает на вас. –

0

Я думаю, что проект, который вы передаете методу, является тем, который вы хотите выполнить UpdateModel, не так ли?

В противном случае вы пытаетесь обновить уже существующие значения, а не новые.

Только мысль,

Dan

код вырезают ниже

[AcceptVerbs (HttpVerbs.Post)] 
public ActionResult Edit (Project project) 

    UpdateModel<Project> (project); 

    if (!ModelState.IsValid) 
      return View (project); 

    var projectService = Factory.GetService<IProjectService>(); 

    project = projectService.SaveProject (project); 

    return RedirectToAction ("Details", new { id = project.ProjectId }); 
} 
+0

проект и не projectToUpdate является один с помощью ModelBinder –

+0

Проблема, которую я не объясняющую очень хорошо, что экземпляр проекта, который исходит от связующего все хорошо, кроме из-за того, что он был сконструирован MVC FW где-то рядом с линией и не извлекается из DataContext. При обновлении этого экземпляра DataContext в основном ничего не делает, вероятно, потому, что он ничего не знает об этом объекте. – Kieron

0

Вам нужно получить оригинальный проект, как вы делаете то, чтобы обновить его свойств, которые изменились в проекте для обновления, чтобы отправить запрос на обновление.

EDIT

Попробуйте этот код я нашел:

public static void CloneProperties(this object origin, ref object destination) 
{ 
    if (destination == null) throw new ArgumentNullException("destination", "Destination object must first be instantiated."); 
    foreach (var destinationProperty in destination.GetType().GetProperties()) 
    { 
     if (origin != null && destinationProperty.CanWrite) 
     { 
      origin.GetType().GetProperties().Where(x => x.CanRead && (x.Name == destinationProperty.Name && x.PropertyType == destinationProperty.PropertyType)) .ToList() .ForEach(x => destinationProperty.SetValue(destination, x.GetValue(origin, null), null)); 
     } 
    } 
} 
+0

Да, это то, что я делаю - то, что я хотел бы, возможно, создать ModelBinder, который сделает это для меня ... просто так мне не нужно каждый раз входить в контроллеры. Если я перейду на другой ORM позже, я буду делать дополнительные, что не требуется. Все, что мне нужно сделать со связующим, это удалить/восстановить оригинал. Есть предположения? – Kieron

+0

http://msdn.microsoft.com/en-us/library/bb896248.aspx – Gregoire

+0

@Gregorie, я пробовал использовать метод Attach некоторое время назад, но он выдает исключение из объекта, который уже существует (я предполагаю, что это проверка на основе на его ПК). – Kieron