我想通过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看起来在第一次提交后等于。
感谢任何帮助。
感谢
答案 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"
} )