7

Nel mio progetto asp.net MVC 4, mi piace proteggere qualcosa da una vista parziale, ovvero quando un utente fa clic per "ulteriori dettagli" . Salvare i dati non è un problema, chiudere la vista parziale non è un problema, aprire la vista parziale non è un problema, è quando il mio modello non è valido (quando un utente dimentica di segnare qualcosa) Il risultato è che la mia vista parziale è restituito, ma non all'interno della vista dove dovrebbe essere. È appena visto come una pagina autonoma.Quando il modello non è valido, tornare alla vista parziale all'interno di una vista, con messaggio di errore

Vista:

@model Evaluatietool.ViewModels.EvaluatorWijzigenOPViewModel 
<h3>@ViewBag.Message</h3> 
@using (Html.BeginForm("ChangeEvaluator", "Ontwikkelplan")) 
{ 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.oldEvalAccount) 
    @Html.HiddenFor(model => model.selectedMedewerkerAccount) 
    @Html.HiddenFor(model => model.eval); 
    @Html.HiddenFor(model => model.countMedewerkers); 
... 

... 
<div class="Buttons"> 
    <input type="submit" value="Submit" /> 
    @Ajax.ActionLink("Sluiten", "Evaluatorenlijst", new AjaxOptions { OnSuccess = "HideResultDiv" }) 
</div> 
} 

Controller:

[HttpPost] 
    public ActionResult ChangeEvaluator(EvaluatorWijzigenOPViewModel ewopvm) 
    { 
     if (ModelState.IsValid) 
     { 
      if (ewopvm.selectedObjects != null) 
      { 
       ewopvm.selectedObjects.Add(ewopvm.selectedMedewerkerAccount); 
      } 
      else 
      { 
       ewopvm.selectedObjects = new List<string>(); 
       ewopvm.selectedObjects.Add(ewopvm.selectedMedewerkerAccount); 
      } 
      Ontwikkelplannen op = new Ontwikkelplannen(); 
      Evaluaties e = new Evaluaties(); 
      foreach (string s in ewopvm.selectedObjects) 
      { 
       op.ChangeEvaluator(ewopvm.newEvalAccount, ewopvm.oldEvalAccount, s, ewopvm.eval); 
      } 
      return RedirectToAction("Evaluatorenlijst"); 
     } 
     return PartialView("EvaluatorWijzigenPartial", ewopvm); 
    } 

Il legame che chiama la vista parziale

@Ajax.ActionLink(item.Evaluator1.Naam, "EvaluatorWijzigenPartial", new { id = item.ID,  eval = true }, new AjaxOptions { UpdateTargetId = "EvaluatorWijzigen", OnComplete = "ShowResultDiv"}) 

Index Page Index page + partial view Partial view returned when model.isvalid != true

risposta

11

Da quello che posso vedere che si sta utilizzando uno standard Html.BeginForm postando l'azione ChangeEvaluator regolatore che o effettua un redirect o restituisce una vista parziale, se la convalida non riesce.

Quindi il comportamento che si sta osservando è perfettamente normale. Si dovrà inviare questo modulo utilizzando AJAX, se si vuole ottenere che:

@using (Ajax.BeginForm("ChangeEvaluator", "Ontwikkelplan", new AjaxOptions { OnSuccess = "handleSuccess" })) 
{ 
    ... 
} 

e allora si potrebbe adattare la vostra azione di controllo in modo che in caso di successo che non reindirizza ma restituisce un oggetto JSON che contiene il uRL per reindirizzare:

[HttpPost] 
public ActionResult ChangeEvaluator(EvaluatorWijzigenOPViewModel ewopvm) 
{ 
    if (ModelState.IsValid) 
    { 
     ... 
     return Json(new { redirectTo = Url.Action("Evaluatorenlijst") }); 
    } 
    return PartialView("EvaluatorWijzigenPartial", ewopvm); 
} 

ed infine scrivere la handleSuccess funzione javascript:

function handleSuccess(result) { 
    if (result.redirectTo) { 
     // The controller action returned a JSON object with the redirectTo property 
     // let's redirect to this location: 
     window.location.href = result.redirectTo; 
    } else { 
     // The controller action returned a partial view with the form and the errors 
     // So we need to update some containing DIV with it: 
     $('#someDivThatCOntainsYourForm').html(result); 
    } 
} 
+0

Se im utilizzando questo metodo, il validator.unobtrusive.parse() ottenuto rimosso vie parziale w. Influisce sui controlli a discesa selezionare. Anche se sto caricando il validator.unobtrusive.parse(), ancora non posso risolvere questo problema. Qualche idea per questo. $ ('# someDivThatCOntainsYourForm'). html (risultato); (==> Se rimuovo questo controllo funzionante) – vinodh

+0

Vale la pena notare che questo non funzionerà se non si dispone del pacchetto Microsoft.jQuery.Unobtrusive.Ajax installato nel tuo progetto. Una volta installato il pacchetto, perfetto! – PTD

Problemi correlati