2009-06-04 17 views
5

Estoy mostrando una lista de elementos para un pedido determinado. Cuando un usuario hace clic en Agregar elemento, lo redirecciono a la página Artículo/Crear. Esta página recopila esa entrada necesaria pero también necesita conocer la identificación del pedido al que pertenece el artículo. ¿Cuál es la forma adecuada de pasar el ID de pedido al Artículo/Crear para que sobreviva a la publicación del formulario cuando se guarda el elemento recién creado?ASP.NET MVC Crear en una relación de detalle maestra

He jugado con TempData y he escrito el ID en la página de detalles a través de Html.Encode(). Me lleva a una parte del camino, ya que la identificación aparece en el formulario del artículo pero el valor se pierde cuando el formulario envía y publica. Supongo que porque no es parte de la colección de formularios. Supongo que mi solución no es la mejor y me gustaría saber si alguien puede indicar la forma correcta de hacerlo en asp.net mvc.

Respuesta

3

Lo hago creando una nueva ruta para el controlador de elementos que incluye el ID de pedido. No tiene sentido tener un artículo sin un pedido, por lo que se requiere el ID de pedido utilizando el parámetro de restricciones.

routes.MapRoute(
    "OrderItems", 
    "Item/{action}/{orderId}/{id}", 
    new { controller = "Item" }, 
    new { orderId = @"d+" } 
); 

lo tanto, el URL sería como http://<sitename>/Item/Create/8, donde 8 es el OrderId para el que desea crear un elemento. Se podría hacer algo similar para Eliminar rutas de acción con http://<sitename>/Item/Delete/8/5, donde 8 es el ID de pedido y 5 es el Id. De artículo.

Sus métodos de acción se vería así:

public ActionResult Create(int orderId) 

public ActionResult Delete(int orderId, int id) 

También puede configurarlo de manera que las direcciones URL parecían http://<sitename>/Order/8/Item/Create y http://<sitename>/Order/8/Item/Delete/5 si que parece mostrar más claramente lo que está pasando.

A continuación, la ruta se vería así:

routes.MapRoute(
    "OrderItems", 
    "Order/{orderId}/Item/{action}/{id}", 
    new { controller = "Item" }, 
    new { orderId = @"d+" } 
); 
+0

Dennis - esto se ve mucho mejor que mi idea. Sin embargo, una aclaración: ¿cómo consigo que orderId sobreviva al Post del OrderItem Controller? Parece que quiere usar la ruta predeterminada, no la recién creada. [AcceptsVerbs (HttpVerbs.Post)] public ActionResult Create (colección FormCollection) – etechpartner

+0

Asegúrese de que la ruta OrderItems esté listada antes de la ruta predeterminada. Eso hace la diferencia. Además, es necesario incluir el parámetro orderId en su método Create: [AcceptsVerbs (HttpVerbs.Post)] public ActionResult Create (int orderId, colección FormCollection) – CoderDennis

+0

Por lo tanto, la url de la publicación Create form's url debe contener orderId como en/Order/8/Artículo/Crear – CoderDennis

0

He utilizado esta secuencia (lo siento si hay errores, que tomé de un ejemplo de trabajo y lo modificó para su pregunta):

1) En la vista Order.Details (Adoptar modelo es de Clase de orden):

... 
<%= Html.ActionLink("Create New Item", "Create", "OrderItem", new { orderId = Model.ID }, null)%> 
... 

2) En la acción OrderItem.Create:

public ActionResult Create(int orderId) 
{ 
    ViewData["orderId"] = orderId; 
    return View(); 
} 

3) En la vista OrderItem.Create:

... 
<% using (Html.BeginForm(new { orderId = ViewData["orderId"] })) 
... 

4) En la acción OrderItem.Create POST:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(int orderId) 
{ 
    // omitted code to create item, associated with orderId 

    return RedirectToAction("Details", "Order", new { orderId = orderId }); 
} 

Si alguien puede pensar en cómo mejorar en esto, o de una mejor manera, por favor, por favor, soy algo nuevo en esto, así que me gustaría mejorar.

0

Para ida y vuelta en un campo que no es parte de la entrada de datos normal, por lo general uso un campo oculto en la vista, así:

<%= Html.Hidden("OrderID", Model.OrderID) %> 

Parece un campo de formulario, actúa como un campo de formulario, pero el usuario no puede verlo. Asegúrese de insertar el OrderID correcto en su modelo desde el controlador.

Cuestiones relacionadas