2015-07-13 2 views
0

J'ai 2 boutons (Enregistrer et Aperçu) dans ma vue partielle. Cette vue partielle fait le poste Ajax et les deux boutons font leur travail bien où Aperçu permet juste de prévisualiser le widget pendant que Enregistrer enregistre les données dans la base de données. Ici j'ai 2 problèmesComment trouver quel bouton est cliqué à partir d'une vue partielle à l'appel onSuccess Ajax

  1. Je suis incapable de trouver quel bouton est cliqué (Ajax.BeginForm onSuccess).
  2. Mon contrôleur n'est pas redirigé vers le lien d'action

publique ActionResult EditWidget (WidgetViewModel viewmodel, chaîne onSave, chaîne onPreview)

{

if(!string.IsNullOrEmpty(onPreview)) 
    { 
     viewmodel.ButtonName = "Preview"; 

     var parameters = ""; 

     if (!string.IsNullOrEmpty(viewmodel.OverriedParameters)) 
      parameters = viewmodel.OverriedParameters; 
     else 
      parameters = viewmodel.DefaultParameters; 

     return PartialView("Widgets/_Preview", previewViewModel); 
    } 
    else if(!string.IsNullOrEmpty(onSave)) 
    { 
     viewmodel.ButtonName = "Save"; 

     if(ModelState.IsValid) 
     { 
      //RedirectToAction("GetPage", "Home", new { Page = pageId 
      return Json(Url.Action("GetPage", new {Page = pageId})); 
     } 
    } 

    return null; 
} 

mon point de vue partielle est la suivante

@using (Ajax.BeginForm("EditWidget", "Home", new AjaxOptions { UpdateTargetId = "divPreview", HttpMethod = "POST", OnBegin = "application.getpage.onBeginPreview", OnSuccess = "application.getpage.onSuccessPreview" })) 
    { 
     <div class="form-inline"> 
      @Html.LabelFor(x => x.OverriedParameters, "Is Widget Active ?", new { @class = "col-sm-2" }) 
      @Html.TextBoxFor(x => x.OverriedParameters, new { @class = "col-sm-1" }) 
     </div> 

     <div class="form-inline"> 
      @Html.LabelFor(x => x.DefaultParameters, "Is Widget Active ?", new { @class = "col-sm-2" }) 
      @Html.TextBoxFor(x => x.DefaultParameters, new { @class = "col-sm-1" }) 
     </div> 

    <div class="form-inline"> 
     <input id="btnSave" name="onSave" type="submit" class="btn btn-primary" style="width:65px" value="Save" /> 
     <input id="btnPreview" name="onPreview" type="submit" class="btn btn-primary" style="width:65px" value="Preview" /> 
    </div> 

    } 

<div id="divPreview" style="margin-top:5px"> 
</div> 

et mon onSuccess est un s suivre

onSuccessPreview: function (data, textStatus, jqXHR) { 
// Here i want to find which button is clicked from my partial view. 
// On Save button click i want to redirect to the action method in the same controller while on Preview button i don't want to do anything 
    } 
+0

Je pense Le bouton d'aperçu ne doit pas afficher le formulaire. Changez son type en 'button' au lieu de' submit'. – Mairaj

+0

avec le bouton de type, je suis incapable d'appeler la méthode d'action qui est responsable du rendu de la vue partielle d'aperçu. –

Répondre

0

Vous pouvez ajouter une entrée cachée:

<div class="form-inline"> 
    <input id="btnSave" name="onSave" type="submit" class="btn btn-primary" style="width:65px" value="Save" /> 
    <input id="btnPreview" name="onPreview" type="submit" class="btn btn-primary" style="width:65px" value="Preview" /> 
    <input type="hidden" id="what-was-clicked" /> 
     </div> 

mise à jour de sa valeur en utilisant la méthode onclick javascript (avant soumettre) et le lire dans votre onSucces:

onSuccessPreview: function (data, textStatus, jqXHR) { 
    var clickedButton = $("#what-was-clicked").val(); 
    } 
+0

Merci beaucoup vhr. Ceci est exactement ce que je cherchais. –

+0

vous êtes les bienvenus :) – vhr