7

Trong dự án asp.net MVC 4 của tôi, tôi muốn an toàn một cái gì đó từ một phần xem, đó là khi người dùng nhấp vào "thêm chi tiết" . Lưu dữ liệu là không có vấn đề, đóng một phần xem là không có vấn đề, mở xem một phần không phải là một vấn đề, đó là khi mô hình của tôi là không hợp lệ (khi người dùng quên đánh dấu một cái gì đó) Kết quả là một phần của tôi là quay trở lại, nhưng không phải bên trong khung cảnh mà nó cần. Nó chỉ được xem như một trang độc lập.Khi mô hình không hợp lệ, hãy quay lại chế độ xem một phần bên trong chế độ xem, với thông báo lỗi

Xem:

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

Bộ điều khiển:

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

Các liên kết mà các cuộc gọi xem phần

@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

Trả lời

11

Từ những gì tôi có thể thấy bạn đang sử dụng một tiêu chuẩn Html.BeginForm gửi bài đến các hành động ChangeEvaluator điều khiển mà một trong hai thực hiện một chuyển hướng hoặc trả về một cái nhìn cục bộ nếu xác nhận thất bại.

Vì vậy, hành vi bạn đang quan sát là hoàn toàn bình thường. Bạn sẽ phải nộp mẫu đơn này sử dụng AJAX nếu bạn muốn đạt được điều đó:

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

và sau đó bạn có thể điều chỉnh hành động điều khiển của bạn để trong trường hợp thành công nó không chuyển hướng nhưng nó sẽ trả về một đối tượng JSON chứa url để chuyển hướng đến:

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

và cuối cùng viết handleSuccess javascript chức năng:

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

Nếu im sử dụng phương pháp này, validator.unobtrusive.parse() bị gỡ bỏ khỏi vie phần w. Nó ảnh hưởng đến các điều khiển thả xuống chọn. Ngay cả khi tôi tải validator.unobtrusive.parse(), tôi vẫn không thể giải quyết vấn đề này. Bất kỳ ý tưởng cho việc này. $ ('# someDivThatCOntainsYourForm'). html (kết quả); (==> Nếu tôi xóa điều khiển này hoạt động tốt) – vinodh

+0

Cần lưu ý rằng điều này sẽ không hoạt động nếu bạn không có gói Microsoft.jQuery.Unobtrusive.Ajax được cài đặt trong dự án của bạn. Sau khi gói đó được cài đặt - hoàn hảo! – PTD