2011-06-10 14 views
21

Estoy trabajando con MVC 3/Razor por primera vez y parece extraño que todos los ejemplos y andamios VS para crear y editar vistas tengan vistas HTML separadas para estos conceptos.MVC Razor - Crear/editar mejores prácticas de vista

Realmente no hay mucha diferencia entre muchos formularios Crear/Editar, por lo que me preguntaba por qué no puedo encontrar ejemplos de personas que usan un solo formulario de actualización que puede ser utilizado por las acciones Crear y Editar.

He obtenido una vista Update.cshtml funcionando pero me preguntaba cómo se relaciona con el método de acción Editar o Crear en el controlador.

Mis preguntas son:

  1. Alguien tiene una respuesta rápida a hablar con el controlador, o
  2. Alguien sabe de un tutorial que muestra una buena práctica para trabajar de esta manera, o
  3. ¿Hay alguna buena razón por la cual las vistas Crear/Editar se separan cuando el HTML suele ser el mismo.

Saludos de Dave

+0

posible duplicado de [ASP.NET MVC - utilizando el mismo formulario para crear y editar] (http://stackoverflow.com/questions/399914/asp-net-mvc-using-the-same-form-to -ambas-crear-y-editar) –

Respuesta

10

Este (! Especie) de la pregunta se hace antes: ASP.NET MVC - using the same form to both create and edit

Básicamente se puede crear una vista parcial e incluirlo en su vista de crear y editar.

Scott Guthrie tiene una buena publicación sobre Partial Views.

(He leído sobre esto en alguna parte, pero no lo encuentro, voy a actualizar este post cuando me lo encuentro)

+0

La publicación de blog de Scott Guthrie trata sobre diseños, no vistas parciales. – jlafay

+1

No creo que esta sea una pregunta duplicada; TS está trabajando en MVC 3 – kite

-1

Mira en MVC andamios en Nuget así, cuando se genera la vista archivos lo hace de manera explícita creando un partial creado y creado, y teniendo la página crear y editar la página usar ese parcial.

3

Hago esto. No sé si es la mejor práctica pero puede ser agradable. Sin embargo, hay algunas situaciones en las que una vista de agregar/editar completamente separada podría ser útil. Además, si está usando ViewModels, hasta donde puedo decir, está atrapado usando el mismo modelo de vista para agregar y editar. En teoría, ambos deberían tener sus propios ViewModels.

Así es como esto se ve por mí:

AddVideo.cshtml

@model Multimedia.MediaVideoViewModel 

@{ 
    Layout = "~/Views/Shared/LiveSubLayout.cshtml"; 
} 

@section AdditionalHeadContent { 

} 

<div class="page-header"> 
    <h1>Add a new video</h1> 
</div> 

<div id="add-video" class="row-fluid"> 
    @Html.Partial("_VideoForm", Model, new ViewDataDictionary { { "ActionKeyword", "Add" } }) 
</div> 

EditVideo.cshtml

@model Multimedia.MediaVideoViewModel 

@{ 
    Layout = "~/Views/Shared/LiveSubLayout.cshtml"; 
} 

@section AdditionalHeadContent { 

} 

@if (ViewBag.Success) 
{ 
    <div class="alert alert-success"> 
    <button class="close" data-dismiss="alert">×</button> 
     <h3><strong>Video saved!</strong></h3><br/> 
     <div class="btn-group"> 
      <a href="#" class="btn">Preview this video</a> 
      @Html.ActionLink("Add Another Video", "AddVideo", "Multimedia", new { Model.Id }, new { @class = "btn" }) 
      @Html.ActionLink("View all media", "Index", "Multimedia", null, new { @class = "btn" }) 
     </div> 
     <p>or continue editing below...</p> 
    </div> 
} 

<div class="page-header"> 
    <h1>Edit video <small>@Model.Title</small></h1> 
</div> 

<div id="edit-video" class="row-fluid"> 
    @Html.Partial("_VideoForm", Model, new ViewDataDictionary { { "ActionKeyword", "Edit" } }) 
</div> 

_VideoForm.cshtml (parcial)

@model Multimedia.MediaVideoViewModel 

@{ 
    string actionKeyword = ViewData["ActionKeyword"].ToString(); 
} 

<div class="span6"> 

    @using (Html.BeginForm("editvideo", "multimedia")) 
    { 
     <label class="control-label" id="embed-url">Paste video URL here:</label> 
     <div class="control-group"> 
      @Html.TextBoxFor(model => model.EmbedUrl, new { @class = "span12", id = "video-url", placeholder = "ex: http://www.youtube.com/watch?v=PoAGasPLh30" }) 
      <button class="btn disabled" id="get-video" title="Tooltip">Get Video</button> 
     </div> 

     <div class="video-meta"> 

      <h3>Video Information</h3> 
      <label class="control-label">Title:</label> 

      <div class="control-group"> 
       @Html.TextBoxFor(model => model.Title, new { @class = "span12", id = "video-title" }) 
       @Html.ValidationMessageFor(model => model.Title, "A title is required", new { @class = "label label-important" }) 
      </div> 

      <label class="control-label">Description:</label> 
      <div class="control-group"> 
       @Html.TextAreaFor(model => model.Description, new { @class = "span12", id = "video-description" }) 
      </div> 

      <h3>Categories</h3> 

      <div id="tag-search" class="well"> 
        <label class="control-label">Search tags:</label> 
        <div class="controls"><input type="text" class="typeahead" /></div> 
        @if (Model != null) 
        { 
         foreach (var category in Model.Tags) 
         { 
          @Html.Partial("_TagFragment", category) 
         } 
        } 
      </div> 

      <hr /> 

      @Html.HiddenFor(model => model.Id) 
      @Html.HiddenFor(model => model.ThumbnailUrl, new { id = "thumb-url" }) 
      <input type="submit" id="video-submit" name="video-submit" class="btn-large btn-primary" value="@actionKeyword video" /> 
     </div> 
    } 

</div> 

Modifiqué un poco estos elementos, por lo que podría faltar algo, pero esto debería darle una idea general.

+0

No cree un nuevo objeto ViewDataDictionary en las vistas AddVideo y EditVideo; los mensajes de validación no funcionarán. – Krahu

0

así es como lo hago, no es siempre la mejor práctica (que depende del caso)

1/combinar las acciones del controlador para crear y editar

public PartialViewResult Creedit(string id = null) 
{ 
    if (id == null) 
    { 
     // Create new record (this is the view in Create mode) 
     return PartialView(); 
    } 
    else 
    { 
     // Edit record (view in Edit mode) 
     Client x = db.ClientSet.Find(id); 
     if (x == null) { return PartialView("_error"); } 
     // ... 
     return PartialView(x); 
    } 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Creedit(Client x) 
{ 
    if (x.id == null) 
    { 
     // insert new record 
    } 
    else 
    { 
     // update record 
    } 
} 

2/combinan la edición y crear vistas en una sola vista me llamaron Creedit

// if you need to display something unique to a create view 
// just check if the Model is null 
@if(Model==null){ 
} 

así que tengo 1 y 2 vista de las acciones (1 entrada y 1 Get) en lugar de 2 y 4 vistas acción.

8

Tenga en cuenta que las respuestas a su pregunta también deben estar motivadas por la necesidad (y los roles) del negocio. El andamio proporciona una funcionalidad separada, que en algunos casos es la implementación preferida.

La funcionalidad CREAR y EDITAR es a menudo bastante idéntica desde una perspectiva técnica (de programación). Esto puede llevar a una persona técnica a pensar que la funcionalidad debe combinarse para implementar una solución técnica más eficiente. Sin embargo, cualquier implementación técnica debe ser en respuesta a las necesidades del negocio, lo que podría requerir la separación (por ejemplo, por función del negocio) de estas preocupaciones.

Por ejemplo, una empresa puede requerir que la función que CREA los objetos comerciales no sea la misma que EDITAR. En este caso, las páginas web implementadas pueden no ser vistas por los mismos roles (y personas) en absoluto.

Si implementa CREATE y EDIT utilizando una funcionalidad común, pero la necesidad empresarial es la separación de roles, debe implementar la "verificación de roles" antes de representar la vista requerida/vista parcial/etc. En tales casos, las vistas separadas pueden ser una implementación preferida.