如何使用MVC Ajax帮助程序更新不同的目标?

时间:2011-02-25 17:29:00

标签: asp.net-mvc ajax target

我很难处理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>

现在,当我按下编辑按钮,然后出现'编辑器视图',但问题是,当我提交该表单时,有两个选项:

  1. 数据正常,更改完成,表单消失,列表刷新。
  2. 数据不正常,表单保留并显示验证消息。
  3. 问题是每个选项的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.如果有错误则更新一个目标,如果没有则更新另一个目标。

    由于

1 个答案:

答案 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。这将是更可重用的,并且如果您想要在服务器端完成替换哪个控件的决定可能有意义。