ASP.NET MVC AJAX изменяет UpdateTargetId, если ModelState недействителен - PullRequest
2 голосов
/ 09 апреля 2009

Я использую вид с двумя частичными видами внутри.

<div id="matches">
    <% foreach (var item in Model)
       { %>
    <% Html.RenderPartial("RenderMatchesListRowUserControl", item); %>
    <% } %>
</div>
<div id="addMatchFormBox">    
    <% Html.RenderPartial("AddNewMatchUserControl");%>
</div>

Первое частичное представление «RenderMatchesListRowUserControl» отображает простой элемент div (для списка совпадений), второе «AddNewMatchUserControl» отображает форму для создания нового совпадения под списком:

Источник AddNewMatchUserControl:

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Ajax.BeginForm("Create", new AjaxOptions
   {
       UpdateTargetId = "matches",
       InsertionMode = InsertionMode.InsertAfter,
       OnSuccess = "flashit",
       OnFailure = "renderForm"
   }))
   {%>
<fieldset>
    <legend>New Match</legend>
    <p>
        <label for="DurationBetweenMovesInDays">
            Dauer (in Tagen) zwischen den Z&uuml;gen:</label>
        <%= Html.TextBox("DurationBetweenMovesInDays")%>
        <%= Html.ValidationMessage("DurationBetweenMovesInDays", "*")%>
    </p>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
<% } %>

В зависимости от ModelState контроллер возвращает частичное представление для новой записи соответствия или частичное представление для формы, чтобы отобразить ошибки модели.

if (Request.IsAjaxRequest()) {
            return ModelState.IsValid ?    PartialView("RenderMatchesListRowUserControl", match) : PartialView("AddNewMatchUserControl");
        }

Работает нормально, пока ModelState не станет недействительным. В этом случае форма будет отображаться в конце списка совпадений, поскольку updatetargetid ссылается на элемент div, который содержит список совпадений. Чтобы избежать этого, необходимо изменить updatetargetid для ссылки на элемент div, содержащий форму. Но я понятия не имею, как это сделать.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

У меня такая же проблема. Я хочу обновить содержимое в div, который содержит форму, если состояние модели недопустимо, и обновить коллекцию данных, если она успешно сохранена. Поэтому я использую трюк вместо использования «UpdateTargetId». Я использую "OnSuccess", чтобы обработать его.

Вот пример.

    @using (Ajax.BeginForm("SaveUser", new AjaxOptions{
HttpMethod = "Post",
LoadingElementId = "save-progress",
OnSuccess = "onUpdateSuccess"
InsertionMode = InsertionMode.Replace}))

Вот пример JavaScript.

function onUpdateSuccess(response, xhr) {
     $('#progress-bar').css({ 'display': 'none' });
     if (response.indexOf('form') != -1) {
        $('#addOrEditUserForm').html(response);

     } else {
       $('#user-table').html(response);
       $('#addOrEditUserForm').html('')
 }

};

0 голосов
/ 18 апреля 2009

Окей. Нет способа достичь этого таким образом. Я решил это с помощью jQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...