首先提交Ajax Form工作,但第二次提交什么都不做

时间:2011-10-06 11:44:56

标签: ajax asp.net-mvc-3 form-submit

我想通过ajax为country-object添加和删除本地化名称。因此我构建了两个局部视图。第一个包含country-object的generel编辑功能,第二个部分视图(将在第一个部分中呈现)包含添加/删除本地化名称的逻辑。

第一部分视图:

@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>

第二部分视图:

@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>

当添加或删除本地化名称时,专用控制器返回第二个局部视图,并通过将内容添加到第一个视图中的“localizedNamesOverview”来替换自身。到目前为止,这个工作正如我预期的那样。

现在的问题是这种行为只运行一次。如果我已成功添加或删除名称,则无法删除/添加第二个名称。目前我无法看到问题所在,因为生成的html看起来在第一次提交后等于。

感谢任何帮助。
感谢

1 个答案:

答案 0 :(得分:0)

好的,我想出了问题所在:

当发出第一个请求并重新呈现第二个局部视图时,它会丢失生成工作链接所需的父级的ViewData信息(countryId)(每个现有本地化的删除链接)名称)。

同样的问题适用于同样失去身份的环绕的ajax形式。通过一些代码的重新定位,我可以解决问题。我将@using( Ajax.BeginForm...代码从第二个局部视图放到父视图中,这样在ajax请求之后就不会重新生成它。

第一部分视图(更新):

@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,所以我从那里开始。

第二部分视图(更新):

@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"
                      } )