Pregunta

Publiqué los antecedentes en esta pregunta hace unos días ... pero la respuesta aún está incompleta, así que vuelve a publicar con un resumen.

Estoy desarrollando una aplicación web MVC 3 Razor, en la que se almacenan los detalles de múltiples categorías de objetos. (Vehículos, casas, instrumentos, etc.). Todos los objetos comparten algunos datos comunes (título, descripción, etc.) y algunos detalles específicos de la categoría en la que pertenece. Se espera que la lista de categorías crezca y, en vista de reducir la mantenimiento, esperamos reutilizar el mismo asistente de objetos. El asistente se basa en la siguiente implementación.

http://afana.me/post/create-wizard-in-aspnet-mvc-3.aspx

En el proceso de asistente de múltiples pasos, el paso final permite al usuario ingresar los detalles específicos de la categoría (modelo, marca, vin, etc. para un vehículo). La página Ver está vinculada al modelo "AssetView", que se define de la siguiente manera

public class AssetView
{
    [Required]      
    public string Title { get; set;  }

    [Required]
    public string Description { get; set;}

    public SpecificAsset AssetDetails { get; set; }
}

La propiedad AssetDetails se cambiará dinámicamente en tiempo de ejecución de acuerdo con el tipo de categoría que se selecciona en una etapa anterior. La vista se ve así

@model AssetView
....
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  ...
 </div>
<div class="wizard-step">
  @Html.EditorFor(model => model.AssetDetails)
 </div>

En el controlador, basado en la selección de categorías. INTALIZO ASSETDETAILS DE LA SIGUIENTE

_thisAsset.AssetDetails = new MotorAsset();

Luego anulo las vistas con las plantillas de editor específicas de tipo.

El asistente funciona bien, pero en el paso de guardado en el controlador, la propiedad "AssetDetails" no tiene valores y se muestra que es de tipo "SpececetAsset", que es el tipo base. No puedo lanzarlo al tipo específico también. Sin embargo, la FormScollection muestra todos los valores, las propiedades específicas "AssetDetails" como "Transmisión", "Make" están en la colección de formularios prefijadas por "AssetDetails_".

Teniendo en cuenta que necesito manejar más de 20 tipos de categorías específicas (motor, casa, etc.) en el paso de guardado del controlador, ¿cómo puedo hacerlo sin algún tipo de truco?

¿Fue útil?

Solución

Si conoce el tipo de AssetDetails, podría hacerlo así:

  1. Tome el AssetView como parámetro a la acción (une las propiedades comunes)
  2. Cree una nueva instancia de las colas de activo específicas (por ejemplo, Cardetails)
  3. Use una de las sobrecargas de TryupDateModel para unir los valores. Hay algunas sobrecargas que le permiten especificar prefijo, por lo que siempre debe funcionar
  4. Agregue este objeto al AssetView.SpecificSetSet

Necesita alguna forma de conocer el tipo específico. Pero supongo que tendrías una variable que rastrea el tipo para que puedas guardarlo correctamente más tarde de todos modos. Si no lo hace, sería fácil de agregar. Recuerde que debe ser AssetView ya que las colas de activos no están atados.

Si necesita validación, hay un TryValidateModel que también podría probar.

Otros consejos

Como entendí, el número de modelos crecerá y desea reutilizar la acción y la vista para todos los modelos. Una opción que veo es hacer un ModelBinder personalizado. Examinaría FormCollection y luego crearía un modelo de activo específico.

El problema con su solución es que SpecectAsset no tiene propiedades, por lo que la aglutinante del modelo predeterminada no se une a ninguno de los campos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top