我很难处理MVC Ajax帮助程序并尝试刷新页面的某些部分。在我的代码中,我有这样的情况:
<div id="ajaxLoadedContent">
<table>
<tr>
<th>
<%: Html.Label("ProductId") %>
</th>
<th>
<%: Html.Label("ProductName") %>
</th>
<th>
</th>
</tr>
<% foreach (var product in Model.Products)
{
%>
<tr>
<td>
<%: direccion.ProductId %>
</td>
<td>
<%: direccion.ProductName %>
</td>
<td>
<% using (Ajax.BeginForm("EditProduct", "MyController",
new { ContainerDiv = "ShowEditProducts" },
new AjaxOptions() { UpdateTargetId = "ShowEditProducts", OnSuccess = "updatePlaceholder" }))
{%>
<%: Html.Hidden("ProductId", product.ProductId)%>
<input type="submit" value="Edit" />
<%} %>
</td>
</tr>
<% } %>
</table>
<script type="text/javascript">
function updatePlaceholder(context) {
var html = context.get_data();
var placeholder = context.get_updateTarget();
$(placeholder).html(html);
return false;
}
</script>
<div id="ShowEditProducts"></div>
</div>
现在,当我按下编辑按钮,然后出现'编辑器视图',但问题是,当我提交该表单时,有两个选项:
问题是每个选项的UpdateTargetId都不同。 选项1刷新“ShowEditProducts”,而选项2刷新“ajaxLoadedContent”。此外,“编辑视图”包含使用“编辑”按钮加载视图时执行的JavaScript,但在表单包含错误并重新渲染时不执行。
EditView的代码如下所示:
<% using (Ajax.BeginForm("SubmitEdit", new AjaxOptions() { UpdateTargetId = Model.ContainerDiv}))
{%>
<script type="text/javascript">
// My JavaScript
</script>
<table>
<tr>
<td>
<%: Html.Label("Id")%></br>
<%: Html.TextBoxFor(x => x.Product.ProductId)%></br>
</td>
<td>
<%: Html.Label("Name")%></br>
<%: Html.TextBoxFor(x => x.Product.ProductName)%><
</td>
</tr>
</table>
<input type="submit" value="Save" />
<%: Ajax.ActionLink("Cancel", "EmptyView","Shared", new AjaxOptions() { UpdateTargetId = Model.ContainerDiv})%>
<% } %>
所以,现在我的两大问题是: 1.重新渲染视图时,不会执行“编辑视图”的JavaScript。 2.如果有错误则更新一个目标,如果没有则更新另一个目标。
由于
答案 0 :(得分:0)
正在替换的对象在此行上设置:
var placeholder = context.get_updateTarget();
所以相反,你应该在这里添加一个条件。例如,如果返回一个如下所示的对象,而不是直接返回HTML:
public class Result
{
public bool Success { get; set; }
public string Html { get; set; }
}
然后你可以这样做:
var result = response.get_response().get_object();
if (result.Success)
$("#ShowEditProducts").html(html);
else
$("#ajaxLoadedContent").html(html);
或者,您可以拥有要替换的控件ID的属性,而不是返回Success boolean。这将是更可重用的,并且如果您想要在服务器端完成替换哪个控件的决定可能有意义。