2010-09-27 9 views
10

Cuando la validación falla, ¿cuál debo devolver? Ver(); o Vista (modelo); ?If (ModelState.IsValid == false) devuelve View(); o Vista (modelo) ;?

Noto que ambos funcionan. Es confuso.

EDIT:

public class MoviesController : Controller 
{ 
    MoviesEntities db = new MoviesEntities(); 

    // 
    // GET: /Movies/ 

    public ActionResult Index() 
    { 
     var movies = from m in db.Movies 
        select m; 
     return View(movies.ToList()); 
    } 

    public ActionResult Create() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(Movie movie) 
    { 
     if (ModelState.IsValid) 
     { 
      db.AddToMovies(movie); 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     else 
      return View();//View(movie); 
    } 
} 

Mi Create.aspx:

<% using (Html.BeginForm()) {%> 
    <%: Html.ValidationSummary(true) %> 

    <fieldset> 
     <legend>Fields</legend> 


     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Title) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Title) %> 
      <%: Html.ValidationMessageFor(model => model.Title) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.ReleaseDate) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.ReleaseDate) %> 
      <%: Html.ValidationMessageFor(model => model.ReleaseDate) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Genre) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Genre) %> 
      <%: Html.ValidationMessageFor(model => model.Genre) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Price) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Price) %> 
      <%: Html.ValidationMessageFor(model => model.Price) %> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

Respuesta

9

Si la vista va a devolver es fuertemente tipado y utiliza el modelo que sería mejor que pasar este modelo. Si simplemente return View() y en la vista intenta acceder al modelo, lo más probable es que obtenga un NullReferenceException.

El siguiente es un patrón común:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = FetchModelFromRepo(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SomeViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     }   

     // TODO: update db 
     return RedirectToAction("index"); 
    } 
} 
+0

Mi punto de vista es fuertemente tipado. Detrás de la escena, ¿por qué ambos pueden darme el mismo resultado? Estoy confundido. – xport

+1

Tal vez porque, en su opinión, solo está utilizando ayudantes Html que, de forma predeterminada, buscarán primero en la solicitud POST y luego en el modelo al enlazar sus valores. Pero si intenta acceder manualmente a una propiedad del modelo como '<%: Model.FooProp%>', probablemente lanzará una excepción. Entonces, si tiene una vista fuertemente tipada ** siempre ** pase el modelo. –

+0

Html helpers en scaffold generado por VWD no está fuertemente tipado? – xport

Cuestiones relacionadas