2009-10-14 5 views
3

Быстрый вопрос относительно обновления списка элементов в asp.net mvc.ASP.NET MVC Обновление списка объектов в одной форме? (привязка модели к списку)

В основном у меня есть метод действия редактирования, который возвращает коллекцию объектов (кстати, структура таблицы выглядит следующим образом: «testID, assetID, Result» - таблица ссылок).

Я в основном хочу, чтобы эти элементы отображались один за другим в форме и чтобы их редактировать. Форма должна быть отправлена ​​назад, а модель-блендер делает свою магию. Но, это не так просто.

Я очистил сеть, и, похоже, большая часть информации об этом материале кажется немного устаревшей. Я столкнулся с this post, который не был обновлен в течение длительного времени и this one, который, кажется, предполагает, что вы не должны привязываться к уже существующему списку для обновления и что есть проблемы при работе с EF или Linq to Sql (который я есть).

Есть ли простой способ достичь того, что я хочу? Изменено ли состояние привязки к модели списка в версии выпуска?

ОБНОВЛЕНИЕ - Чуть ближе ...

Вот мой метод Edit:

public ActionResult EditSurveyResults(Guid id) 
    { 
     var results = surveyRepository.GetSurveyResults(id); 
     return PartialView("EditSurveyResults", results); 
    } 

И моя форма:

<div id="editSurveyResults"> 
<h2> 
    EditSurveryResults</h2> 

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 
<% using (Html.BeginForm()) 
    {%> 
<fieldset> 
    <legend>Results</legend> 
    <% int i = 0; foreach (var result in Model) 
    { %> 

    <input type="hidden" name='results[<%= i %>].TestID' value='<%= result.TestID %>' /> 
    <input type="hidden" name='results[<%= i %>].AssetID' value='<%= result.AssetID %>' /> 
    <p> 
     <%= result.Task.TaskName%> 
    </p> 
    <p> 
     <label for="Result"> 
      Result:</label> 
     <input type="text" name='results[<%= i %>].Result' value='<%= result.Result %>' /> 
     <%= Html.ValidationMessage("Result", "*")%> 
    </p> 

    <% i++; } %> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
<% } %> 

И мой метод редактирования POST:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult EditSurveyResults(Guid id, IList<SurveyTestResult> results) 
    { 
     var oldValues = surveyRepository.GetSurveyResults(id); 

     if (ModelState.IsValid) 
     { 
      UpdateModel(oldValues); 
      surveyRepository.Save(); 
      return Content("Done"); 
     } 
     else 
      return PartialView("EditSurveyResults"); 
    } 

Это не полный, конечно, но он ничего не обновляет в своем текущем состоянии. Я пропустил трюк здесь? результаты заселяются обновленными объектами, поэтому я не уверен, почему его не обновляет ...

ОБНОВЛЕНИЕ 2: Итак, я начинаю думать, что модель не подходит для этого. Итак, я прибегал к тому, чтобы делать вещи более взбешенным образом. Если кто-нибудь может обнаружить проблему с этим, пожалуйста, дайте мне знать. FYI - эта форма будет захвачена AJAX, поэтому я не верну взгляд, а просто сообщение. Вот новый код:

IList<SurveyTestResult> oldValues = surveyRepository.GetSurveyResults(id).ToList(); 
      foreach (var result in SurveyTestResult) 
      { 
       //SurveyTestResult is the IList that comes down from the form.      
       SurveyTestResult thisone = oldValues.Single(p => p.AssetID == result.AssetID && 
        p.TestID == result.TestID); 
       //update the old entity with the result from the new one 
       thisone.Result = result.Result; 
      } 

А потом я вызываю Сохранить в моем хранилище.

Заранее спасибо

+0

Я сейчас на этапе, когда я возвращаю Model Binder со списком обновленных сущностей, но UpdateModel() при передаче с исходной коллекцией ничего не обновляет. – Sergio

+0

Как вы получаете «результаты» метода UpdateModel? – Lazarus

+0

Предполагалось, что это автоматический процесс. Разве это не так? – Sergio

ответ

5

Одна вещь, я заметил, что вы не делает <input type="hidden" name='results.Index' value='<%= i %>' /> как phil Haacks статья упоминает является обязательным.

Переключение на другой Modelbinder также может сделать трюк. Я использую связывание модели DataAnnotations, и с этим мне не нужно генерировать поля .Index при привязке к List.

+0

Да, я читал, что был обесценен в RC1 или что-то в этом роде. Подумайте, что он упоминается во второй ссылке, которую я опубликовал (в комментариях). Я не знаю, есть ли у меня время, чтобы поиграть с новыми привязками к модели. Я бы хотел, но его еще один кусок вещей, чтобы узнать, что, без сомнения, займет у меня возраст ... – Sergio

+0

это исправлено моя проблема – DavidJones