Первая отправка формы Ajax работает, но вторая отправка ничего не делает - PullRequest
0 голосов
/ 06 октября 2011

Я хочу добавить и удалить локализованные имена для объекта страны через ajax.Поэтому я построил два частичных представления.В первом содержится функция общего назначения редактирования для страны-объекта, а во втором частичном представлении (которое будет отображаться внутри первого) содержится логика для добавления / удаления локализованных имен.

1-е частичное представление:

@model CountryViewModel

// scripts here

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
    [...] // the fields of the object to edit...
    </fieldset>
}

// this tag will be updated by the partial view
<div id="localizedNamesOverview"> 

@Html.Partial( "LocalizedNamesOverview",
               Model.LocalizedNames,
              new ViewDataDictionary 
              { 
                 { "countryId", Model.CountryId } 
              } )

</div>

2-е частичное представление:

@model IEnumerable<LocalizedNameViewModel>

<table>

@foreach (var item in Model) 
{
    <tr>
        <td> @item.Language </td>
        <td> @item.Name </td>
        <td>
            @Ajax.ActionLink( "Delete",
                              "DeleteLocalizedName",
                              "Country",
                              new { countryId = this.ViewData[ "countryId" ], 
                                    localizedNameId = item.CountryI18nId },
                              new AjaxOptions
                              {
                                 UpdateTargetId="localizedNamesOverview",
                                 InsertionMode=InsertionMode.Replace,
                                 HttpMethod="POST"
                              } )
        </td>
    </tr>
}

@using( Ajax.BeginForm( "AddLocalizedName",
                        "Country",
                        new { countryId = this.ViewData[ "countryId" ] },
                        new AjaxOptions
                        {
                           UpdateTargetId = "localizedNamesOverview",
                           InsertionMode = InsertionMode.Replace,
                           HttpMethod = "POST"
                        } ) )
{
   <tr>
      <td> <input class="text-box single-line" id="LanguageId" name="LanguageId" value="" type="text" /> </td>
      <td> <input class="text-box single-line" id="Name" name="Name" value="" type="text" /> </td>
      <td> <input type="submit" value="Add new localized name" /> </td>
   </tr>
}

</table>

Выделенный контроллер возвращает 2-е частичное представление, когда локализованное имя либо добавляется, либо удаляется, и заменяет себя, добавляя содержимое в «localizedNamesOverview» из1-й вид.Пока это работает так, как я ожидал.

Проблема в том, что это поведение работает только один раз.Если я успешно добавил или удалил имя, я не могу удалить / добавить второе.На данный момент я не вижу, в чем проблема, потому что сгенерированный HTML выглядит равным после первой отправки.

Любая помощь приветствуется.
Спасибо

1 Ответ

0 голосов
/ 06 октября 2011

Хорошо, я выяснил, в чем проблема:

Когда первый запрос сделан, и 2-й частичный просмотр повторно представлен, он теряет информацию ViewData (countryId) от родителя, который необходим длясгенерируйте рабочие ссылки (delete-link для каждого существующего локализованного имени).

Та же проблема относится к окружающей ajax-форме, которая также теряет идентификатор.Посредством некоторого изменения положения кода я смог решить проблему.Я поместил код @using( Ajax.BeginForm... из 2-го частичного представления в родительское представление, чтобы он не был восстановлен после ajax-запроса.

1-е частичное представление (обновлено):

@using( Ajax.BeginForm( "AddLocalizedName",
                        "Country",
                        new { countryId = this.ViewData[ "countryId" ] },
                        new AjaxOptions
                        {
                          UpdateTargetId = "localizedNamesOverview",
                          InsertionMode = InsertionMode.Replace,
                          HttpMethod = "POST"
                        } ) )
{

// this tag will be updated by the partial view
<div id="localizedNamesOverview"> 

@Html.Partial( "LocalizedNamesOverview",
               Model.LocalizedNames,
               new ViewDataDictionary 
               { 
                  { "countryId", Model.CountryId } 
               } )

</div>

}

Проблема удаления ссылки может быть решена, потому что моя модель LocalizedNameViewModel также содержит выделенный countryId, и поэтому я беру ее оттуда.

2-е частичное представление (обновлено):

@Ajax.ActionLink( "Delete",
                  "DeleteLocalizedName",
                  "Country",
                  new { countryId = item.CountryId, // took countryId from the model
                        localizedNameId = item.CountryI18nId },
                  new AjaxOptions
                      {
                        UpdateTargetId="localizedNamesOverview",
                        InsertionMode=InsertionMode.Replace,
                        HttpMethod="POST"
                      } )
...