5

tengo estas clases que se asigna utilizando entidad Código Marco: PrimeraASP.NET MVC 3 Uno-A-Muchos Formulario

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
    //... additional properties 
    [Required] 
    public virtual ICollection<Address> Addresses { get; set; } 
} 
public class Address 
{ 
    public int AddressId { get; set; } 
    public string Street { get; set; } 
    //... additional properties 

    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 

Por lo tanto, el uso de ASP.NET MVC 3, ¿cómo puedo realizar la vista de edición para que la persona complete todas las propiedades de una persona dentro de una dirección en un solo formulario?

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Person</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Adresses.FirstOrDefault().Street) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Adresses.FirstOrDefault().Street) 
      @Html.ValidationMessageFor(model => model.Adresses.FirstOrDefault().Street) 
     </div> 

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

Esto funciona bien para mostrar las entradas con la calle de la base de datos, pero cuando lo hago la presente, el cambio doesnt calle.

[HttpPost] 
public ActionResult Edit(int id, FormCollection formCollection) 
{ 
    Person person = unityOfWork.PersonRepository.GetById(id); 

    UpdateModel<Person>(person); 

    if (ModelState.IsValid) 
    { 
     unityOfWork.PersonRepository.Update(person); 
     unityOfWork.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(person); 
} 

Respuesta

3

Debido a la forma en que el ligante modelo tiene que arreglar las colecciones, se luchando porque las pertinentes de identificación no están presentes.

Sería mejor crear un ViewModel para esta pantalla y traducirlo con el modelo de dominio subyacente.

Si estuviera proporcionando una instalación para editar todas las direcciones, usaría Steve Sanderson's BeginCollectionItem helper. Pero como solo está editando una sola dirección, una nueva clase de ViewModel con una propiedad Person y una propiedad de dirección separada sería más fácil, o usaría una clase que incluyera las propiedades de Person y Address que son relevantes para esta vista.

Soy un gran defensor de la Separación de Preocupaciones. Hay lógicamente tres modelos en su aplicación; el modelo de Entidad que describe la implementación del almacenamiento de datos en su base de datos, el modelo de Vista que describe la implementación de la representación de datos en la UI y el modelo de Dominio que es la representación lógica de los datos dentro de su aplicación. Es tentador usar el mismo modelo para cada propósito, como lo está haciendo aquí. Pero tan pronto como sus necesidades no se vuelvan triviales, se convierte en una carga, por lo que es mejor que cree clases que funcionen mejor donde las necesite.