2016-06-02 8 views
0

Ich habe eine Teilansicht, von der ich einen modalen Dialog mit aktualisierten Daten anzeigen möchte. Ein Benutzer, der auf das div klickt, würde sowohl die Anzeige des modalen als auch des Ajax-Aufrufs auslösen, damit der Inhalt des Modals aktualisiert wird.asp.net mvc ajax.beginform wird als html.beginform gesendet

<div class="nMmenuItem" >  
 
    @using (Ajax.BeginForm("editItem","nMrestaurant",new { id = Model.ID }, 
 
     new AjaxOptions 
 
     { 
 
      HttpMethod = "get", 
 
      InsertionMode = InsertionMode.Replace, 
 
      UpdateTargetId = "myModalDocument" 
 
     }, new { id = "ajaxEditItem" })) 
 
    { 
 
     <div data-toggle="modal" data-target="#myModal" 
 
      onclick="$('form#ajaxEditItem').submit();">    
 
      <div class="text-center"> 
 
       @Model.name 
 
      </div> 
 
     </div>   
 
    } 
 
</div>

Ich habe einen Platzhalter für den modalen innerhalb der übergeordneten Ansicht:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 
 
    <div class="modal-dialog" role="document" id="myModalDocument"> 
 
     @Html.Partial("_editItem", new nMvMmenuItem()) 
 
    </div> 
 
</div>

Doch während die Controller-Aktion erwartet eine AjaxResquest, die Steuerung wertet Request.IsAjaxRequest() als false aus.

public async Task<ActionResult> editItem(int? id) 
    { 
     if (Request.IsAjaxRequest()) 
     {     
      return PartialView("_editItem", await db.nMmenuItems.FindAsync(id)); 
     } 
     return View(); 
    } 

Dies aktualisiert die gesamte Ansicht und verhindert, dass das Modal funktioniert.

ich die folgenden Skripte in der _Layout.cshtml Seite am Bündelungs:

"~/Scripts/jquery-{version}.js", 
"~/Scripts/jquery-ui-{version}.js", 
"~/Scripts/jquery.unobstrusive*", 
"~/Scripts/jquery.validate", 
"~/Scripts/bootstrap.js", 
"~/Scripts/respond.js" 

Vielen Dank für Ihre Hilfe!

+0

Warum nicht einfach die Anfrage in seine eigene Methode aufteilen und die IsAjaxRequest Prüfung vollständig ablegen? –

+0

Überprüfen Sie die Entwicklerkonsole in Ihrem Browser und prüfen Sie, ob Sie JS-Fehler haben. Ein Fehler unterbricht das Parsen anderer Skripte, und 'Ajax.BeginForm' wurde entwickelt, um auf einen standardmäßigen Nicht-Ajax-Form-Post zurückzugreifen. –

+0

@ChrisSearles, Sie haben Recht Ich könnte die Methode auf diese Weise teilen, obwohl das das Problem hier nicht lösen wird. Ich habe es so gehalten, um die falsche Auswertung von IsAjaxRequest zu sehen, um zu überprüfen, ob der Anruf als Ajax genommen wird oder nicht. – donquijote

Antwort

0

Ich fand, dass das Anhängen von submit() an das onclick -Ereignis des Formulars eine AJAX-Anforderung nicht ausführen würde. Meine Lösung ist somit Ajax.SubmitForm und stattdessen beschäftigen sich mit dem Click-Ereignis in meinem js zu entfernen:

Die aktualisierte Ansicht sieht wie folgt aus:

<div class="nMmenuItem"> 
<form method="get" action="@Url.Action("editItem","nMrestaurant",new { id = Model.ID })" 
     data-nM-ajax="true" data-nM-target="#myModalContent"> 
    <div>    
     <div class="text-center"> 
      @Model.name 
     </div>    
    </div> 
</form> 

In den js I bindet die Formular-Vorlage zu dem Click-Ereignis des übergeordneten div:

$('.nMmenuItem').click(ajaxFormSubmit); 

und die Funktion, die das Formular Vorlage behandelt und öffnet die resultierende modale di alog:

var ajaxFormSubmit = function() {   

    var $form = $(this).children('form:first'); 

    var options = { 
     url: $form.attr("action"), 
     type: $form.attr("method"), 
     data: $form.serialize() 
    }; 

    $.ajax(options).done(function (data) { 
     var $target = $($form.attr("data-nM-target"));      
     $target.replaceWith(data); 
     $("#myModal").modal(dialogOpts); 
    }); 

    return false; 

}; 
0

Überprüfen Sie, ob Sie die unauffällige Ajax-Client-Skripte installiert haben - Ihr Bündel Muster sieht aus wie es sie abholen, wenn sie da sind, aber ich glaube nicht, dass sie in dem Standardprojekt installiert:

Install-Package Microsoft.jQuery.Unobtrusive.Ajax 

Während das Ajax.BeginForm im Standard-MVC-Projekt enthalten ist, sind die Client-Skripts nicht und diese sind verantwortlich für das Laden des Inhalts, ohne die gesamte Seite zu aktualisieren.

+0

Sie haben Recht, die unaufdringlichen Ajax-Client-Skripte wurden nicht installiert.Ich habe sie so installiert, wie Sie es vorgeschlagen haben, aber ich muss hier etwas anderes machen, weil die Lösung immer noch nicht funktioniert, d. H. Der Controller gibt die Teilansicht zurück, wird aber auf einer leeren neuen Seite angezeigt, anstatt den beabsichtigten Teil des Modals zu ersetzen. – donquijote