2013-09-05 10 views
14

mio backgroundASP.NET MVC convalida in Vista parziale e tornare alla vista primaria

Sto lavorando al primo progetto serio utilizzando ASP.NET MVC 4. Sto lavorando sullo sviluppo web in quanto giorni ASP classico e dispongono ho una buona presa su Webforms. MVC è molto eccitante e sto facendo buoni progressi. Ma ora sono in una situazione in cui ho bisogno di aiuto su questo forum.

sfondo Query

Ho una vista padre e al suo interno v'è una vista parziale. La vista parziale contiene un modulo e un pulsante di invio. La vista parziale ha il proprio modello di vista locale e quel modello di vista è una delle proprietà del modello di vista Parent.

Nel caso in cui le convalide su viste parziali non riescano, voglio mostrare la vista genitore così com'è e evidenziare i campi non validi nella vista parziale.

Il codice non si rompe da nessuna parte, ma quando c'è un errore di convalida, in qualche modo, non sto trovando il modo giusto per mostrare la vista genitore con il modello inizializzato passato ad esso. E, naturalmente, per evidenziare gli errori nella vista parziale.

Qualsiasi aiuto sarebbe apprezzato. Grazie.

codice assomiglia seguenti:

Visualizza i modelli:

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

Parent Visualizza

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

vista parziale (_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" /> 
} 

risposta

8

Hai bisogno di mostrare la non vista padre del figlio unico, quindi l'azione dovrebbe essere simile:

[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

che rende perfettamente senso . Ma esiste un modo per evitare di inizializzare nuovamente il modello principale su submit? In questo momento sto provando a passare il modello principale a SubmitReview, ma il modello genitore non ricorda i valori. Ma grazie per il tuo suggerimento, implementerò quel coz che funzionerà. –

+0

su invio, come dovrei ottenere la chiave del genitore per inizializzarla? Spero di avere un senso ..... –

+0

Puoi spostarti per il modulo nella vista genitore (che è in realtà una buona pratica), quindi aggiungere il modello genitore in campi nascosti, quindi quando fai clic su invia otterrai i dati completi nel controller –

Problemi correlati