Как обновить разные цели с помощью MVC Ajax helper? - PullRequest
0 голосов
/ 25 февраля 2011

Мне трудно работать с помощником 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. Данные не в порядке, формы остаются и проверкапоявляются сообщения.

Проблема в том, что UpdateTargetId различаются для каждой опции.Вариант 1 обновляет «ShowEditProducts», а вариант 2 обновляет «ajaxLoadedContent».Кроме того, 'Edit View' содержит JavaScript, который выполняется, когда представление загружается с помощью кнопки "Edit", но не выполняется, когда форма содержит ошибки и повторно визуализируется.

Код внешнего вида 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 «Edit View» не выполняется при повторном рендеринге представления.2. Как я могу обновить одну цель, если есть ошибки, а другая - нет?

Спасибо

1 Ответ

0 голосов
/ 03 марта 2011

Заменяемый объект устанавливается в этой строке:

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);

В качестве альтернативы, вместо возврата логического значения Success, у вас может быть свойство для замены идентификатора элемента управления. Это будет более пригодно для повторного использования и может иметь смысл, если вы хотите, чтобы решение о том, какой элемент управления заменить, должно выполняться на стороне сервера.

...