7

W moim projekcie asp.net MVC 4, lubię zabezpieczyć coś z częściowego widoku, czyli wtedy, gdy użytkownik kliknie "więcej szczegółów" . Zapisywanie danych nie stanowi problemu, zamknięcie częściowego widoku nie stanowi problemu, otwórz częściowy widok nie jest problemem, to jest, gdy mój model nie jest prawidłowy (gdy użytkownik zapomni oznaczyć coś) Powoduje to, że mój częściowy widok jest powrócił, ale nie w widoku, gdzie powinien być. Jest to po prostu postrzegana jako samodzielna strona.Gdy model jest nieprawidłowy, powróć do częściowego widoku wewnątrz widoku, z komunikatem o błędzie

Widok:

@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> 
} 

Kontroler:

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

link, który wywołuje częściowy widok

@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

Odpowiedz

11

Z tego co widzę używasz standardowego Html.BeginForm delegowania do działania ChangeEvaluator kontrolera, które albo wykonuje przekierowanie lub powraca częściowy widok jeśli uwierzytelnienie nie powiedzie.

Zachowanie, które obserwujesz, jest całkowicie normalne. Będziesz musiał przesłać ten formularz przy użyciu AJAX, jeśli chcesz osiągnąć:

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

a następnie można dostosować działanie kontrolera tak, że w przypadku sukcesu to nie przekierowuje ale zwraca obiekt JSON zawierający URL przekierować do:

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

i wreszcie napisać handleSuccess funkcji 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

Jeśli im przy użyciu tej metody, validator.unobtrusive.parse() został usunięty z częściowym vie w. Wpływa na wybór elementów sterujących rozwijanych. Nawet jeśli ładuję validator.unobtrusive.parse(), nadal nie mogę rozwiązać tego problemu. Każdy pomysł na to. $ ('# someDivThatCOntainsYourForm'). html (result); (==> Jeśli usunę te kontrolki działa poprawnie) – vinodh

+0

Warto zauważyć, że to nie zadziała, jeśli nie masz pakietu Microsoft.jQuery.Unobtrusive.Ajax zainstalowane w twoim projekcie. Po zainstalowaniu tego pakietu - idealnie! – PTD

Powiązane problemy