Pregunta

Estoy usando la versión beta de MVC para escribir una aplicación sencilla para entender ASP.Net MVC. La aplicación es un sitio simple para compartir fotos / videos con etiquetado. Estoy trabajando en el proyecto esqueleto MVC. Agregué algunos Html.ActionLink () a la barra de navegación, pero tengo un problema con uno de los Html.ActionLink () que agregué en un solo lugar.

Quiero que ~ / Etiquetas muestre todas las etiquetas de la base de datos y quiero que ~ / Etiquetas / {etiqueta} muestre una lista de todos los archivos que están etiquetados con {etiqueta}. Esto funciona como se esperaba, pero cuando sigo un ~ / Tags / {tag}, cambia el Html.ActionLink () en la barra de navegación para que sea el mismo que el enlace ~ / Tags / {tag} en lugar de solo apuntar a ~ / Etiquetas. No entiendo por qué el ActionLink () en mi barra de navegación está cambiando cuando sigo ~ / Tags / {tag}. Si navego a un enlace diferente en el proyecto, el ActionLink () funciona como se esperaba.

Tengo el enlace de acción y la ruta configurados de esta manera. Mi TagsController tiene esta acción de índice. ¿El INT? Es para un control de paginación. Tengo dos vistas, una llamada Todos y otra llamada Detalles. ¿Qué estoy haciendo mal?

        Html.ActionLink("Tags", "Index", "Tags") // In navigation bar

        routes.MapRoute(
            "Tags",
            "Tags/{tag}",
            new
            {
              controller = "Tags", action = "Index", tag = "",
            });

        public ActionResult Index(string tag, int? id )
        {  // short pseudocode
           If (tag == "")
             return View("All", model)
           else
             return View("Details", model) 
        }
¿Fue útil?

Solución

Creo que necesitas manejar una instancia de yoursite.com/Tags/, ya que solo estás manejando una con una etiqueta.

Yo crearía otra ruta:

routes.MapRoute(
  "TagsIndex", //Called something different to prevent a conflict with your other route
  "Tags/",
  new { controller = "Tags", action = "Index" }
);

routes.MapRoute(
  "Tags",
  "Tags/{tag}",
  new { controller = "Tags", action = "Tag", tag = "" }
);


/* In your controller */
public ActionResult Index() // You could add in the id, if you're doing paging here
{
  return View("All", model);
}

public ActionResult Tag(string tag, int? id)
{
  if (string.IsNullOrEmpty(tag))
  {
    return RedirectToAction("Index");
  }

  return View("Details", model);
}

Otros consejos

Además de crear una ruta adicional como lo menciona Dan Atkinson, también debe deshacerse de la instrucción if en el controlador y crear otro método de controlador (llamado Detalles) para manejar los detalles de la etiqueta. Si las declaraciones en un controlador para determinar qué vista mostrar son un olor de código. Deje que el motor de enrutamiento haga su trabajo y su código de controlador será más simple y fácil de mantener.

Le sugiero que mire las expresiones Lamda para manejar esto, puede terminar con una 'sopa de etiquetas' en el futuro.

Además, asegúrese de haber descargado la dll Microsoft.Web.Mvc, difiere de System.Web.Mvc.

Dónde obtener Microsoft.Web.Mvc.dll

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