2013-09-05 11 views
14

Moj TłoASP.NET MVC Validation w częściowym widokiem i powrócić do widoku dominującej

Pracuję nad pierwszym poważnym projektem przy użyciu ASP.NET MVC 4. Pracuję na tworzenie stron internetowych od klasycznych ASP dni i mieć dobrze trzymaj się formularzy internetowych. MVC jest bardzo ekscytujące i robię duże postępy. Ale teraz jestem w sytuacji, w której potrzebuję pomocy na tym forum.

tło Zapytanie

Mam widoku nadrzędnego i wewnątrz niego znajduje się częściowy widok. Częściowy widok zawiera formularz i przycisk Wyślij. Widok częściowy ma własny lokalny model widoku, a ten model widoku jest jedną z właściwości modelu widoku nadrzędnego.

W przypadku niepowodzenia sprawdzania poprawności w widokach częściowych, chcę wyświetlić widok macierzysty taki, jaki jest i podświetlić nieprawidłowe pola w widoku częściowym.

Kod nie jest łamany w dowolnym miejscu, ale gdy pojawia się błąd sprawdzania poprawności, w jakiś sposób nie znajduję prawidłowego sposobu wyświetlania widoku nadrzędnego z przekazanym mu zainicjowanym modelem. I oczywiście, aby podkreślić błędy w widoku częściowym.

Każda pomoc zostanie doceniona. Dzięki.

Kod wygląda następujące:

Zobacz modele:

public class ParentViewModel 
{ 
    public int TitleId { get; set; } 
    public string Name { get; set; } 
    public ChildViewModel Child { get; set; } 
} 

public class ChildViewModel 
{ 
    [Required] 
    public decimal Rating { get; set; }   

    [Required] 
    [StringLength(500)] 
    [Display(Description = "Review")] 
    [RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")] 
    public string ReviewText { get; set; } 
} 

Controller

public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new ParentViewModel() 
         { 
          TitleId = 1,Name = "Parent name", 
          Child = new ChildViewModel() 
             { 
              Rating = 2.5M, ReviewText = "Its a must watch!" 
             } 
         }; 
     return View("Index", model); 
    } 

    [HttpPost] 
    public ActionResult SubmitReview(ChildViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      return View("_child", model); 
     } 

     ModelState.AddModelError("", "Some Error."); 
     return View("_child", model); 
    } 
} 

nadrzędna Zobacz

@model ParentViewModel 
@{ 
    Layout = null; 
} 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Index</title> 
</head> 
<body> 
    <div> 
     @Model.TitleId, @Model.Name   
    </div> 
    <div> 
     @Html.Partial("_child", Model.Child) 
    </div> 
</body> 
</html> 

Częściowy widok (_child.cshtml)

@model ChildViewModel 
@using (Html.BeginForm("SubmitReview", "Test")) 
{ 
    @Html.ValidationSummary(true) 

    @Html.TextBoxFor(m => m.Rating)  @Html.ValidationMessageFor(m => m.Rating) 
    @Html.TextBoxFor(m => m.ReviewText) @Html.ValidationMessageFor(m => m.ReviewText) 
    <input type="submit" value="Log in" /> 
} 

Odpowiedz

8

Trzeba pokazać nie widok rodzica dziecka jeden, więc akcja powinna wyglądać następująco:

[HttpPost] 
    public ActionResult SubmitReview(ChildViewModel model) 
    { 
      var parentViewModel = write init code here; 
      parentViewModel.ChildModel = model; 

     if (ModelState.IsValid) 
     { 

      return View("Index", parentViewModel); 
     } 

     ModelState.AddModelError("", "Some Error."); 
     return View("Index", parentViewModel); 
    } 
+0

To ma sens . Ale czy istnieje sposób na uniknięcie inicjowania modelu macierzystego po przesłaniu? Obecnie próbuję przekazać model nadrzędny do funkcji SubmitReview, ale model nadrzędny nie zapamiętuje wartości. Ale dzięki za twoją sugestię, zaimplementuję to, że będzie działało. –

+0

po przesłaniu, w jaki sposób powinienem uzyskać klucz rodzica, aby go zainicjować? Mam nadzieję, że mam jakiś sens ... –

+0

Możesz przenieść formularz do widoku rodzica (to jest rzeczywiście dobra praktyka), a następnie dodać model nadrzędny do ukrytych pól, więc po kliknięciu przycisku "prześlij" otrzymasz pełne dane w kontrolerze –

Powiązane problemy