vista una route pasar parametros pagina net mvc httpget establecer controlador attribute asp asp.net-mvc routing controller

asp.net mvc - una - Categorías de controladores en MVC Routing?(Nombres de controlador duplicados en espacios de nombres separados)



pasar parametros de una vista a un controlador mvc (2)

De hecho, no lo encontré buscando, sino examinando los foros de ASP .NET en esta pregunta .

Al utilizar esto, puede tener los controladores del mismo nombre en cualquier parte del espacio de nombres, siempre que califique qué rutas pertenecen a qué espacios de nombres (¡puede tener múltiples espacios de nombres por rutas si lo necesita!)

Pero a partir de aquí, puede colocar un directorio debajo de su controlador, de modo que si su controlador era "MyWebShop.Controllers", colocaría un directorio de "Shop1" y el espacio de nombres sería "MyWebShop.Controllers.Shop1".

Entonces esto funciona:

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); var shop1namespace = new RouteValueDictionary(); shop1namespace.Add("namespaces", new HashSet<string>(new string[] { "MyWebShop.Controllers.Shop1" })); routes.Add("Shop1", new Route("Shop1/{controller}/{action}/{id}", new MvcRouteHandler()) { Defaults = new RouteValueDictionary(new { action = "Index", id = (string)null }), DataTokens = shop1namespace }); var shop2namespace = new RouteValueDictionary(); shop2namespace.Add("namespaces", new HashSet<string>(new string[] { "MyWebShop.Controllers.Shop2" })); routes.Add("Shop2", new Route("Shop2/{controller}/{action}/{id}", new MvcRouteHandler()) { Defaults = new RouteValueDictionary(new { action = "Index", id = (string)null }), DataTokens = shop2namespace }); var defaultnamespace = new RouteValueDictionary(); defaultnamespace.Add("namespaces", new HashSet<string>(new string[] { "MyWebShop.Controllers" })); routes.Add("Default", new Route("{controller}/{action}/{id}", new MvcRouteHandler()) { Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }), DataTokens = defaultnamespace }); }

La única otra cosa es que hará referencia a una vista que aún esté en el directorio base, por lo que si coloca la vista en los directorios para que coincida, deberá ingresar el nombre de la vista cuando la devuelva dentro del controlador.

Estoy buscando algunos ejemplos o ejemplos de enrutamiento para el siguiente tipo de escenario:

El ejemplo general de hacer las cosas es: {controller} / {action} / {id}

Entonces, en el escenario de hacer una búsqueda de productos para una tienda, tendrías:

public class ProductsController: Controller { public ActionResult Search(string id) // id being the search string { ... } }

Supongamos que tiene algunas tiendas para hacer esto y que desea que siempre, ¿hay alguna manera de tener entonces: {category} / {controller} / {action} / {id}

¿Para que pueda tener una búsqueda particular de una tienda en particular, pero use un método de búsqueda diferente para una tienda diferente?

(Si requirió que el nombre de la tienda fuera una prioridad más alta que la función misma en la url)

O se reduciría a:

public class ProductsController: Controller { public ActionResult Search(int category, string id) // id being the search string { if(category == 1) return Category1Search(); if(category == 2) return Category2Search(); ... } }

Puede que no sea un gran ejemplo, pero básicamente la idea es usar el mismo nombre de controlador y, por lo tanto, tener una URL simple en algunos escenarios diferentes, o ¿estás atascado con la necesidad de nombres únicos de controlador y no hay manera de ponerlos en espacios de nombres / directorios ligeramente diferentes?

Editar para agregar:

La otra razón por la que quiero esto es porque podría querer una URL que tenga las categorías, y que ciertos controladores solo funcionen bajo ciertas categorías.

ES DECIR:

/ this / search / items / search + term <- funciona

/ that / search / items / search + term <- no funcionará - porque el controlador de búsqueda no está permitido.


La mejor forma de hacerlo sin ningún compromiso sería implementar su propio ControllerFactory heredando de IControllerFactory. El método CreateController que implementará maneja la creación de la instancia del controlador para manejar la solicitud de RouteHandler y ControllerActionInvoker. La convención es usar el nombre del controlador, al crearlo, por lo tanto, tendrá que anular esta funcionalidad. Aquí será donde coloque su lógica personalizada para crear el controlador según la ruta, ya que tendrá múltiples controladores con el mismo nombre, pero en diferentes carpetas. Luego deberá registrar su fábrica de controlador personalizado en el inicio de la aplicación, al igual que sus rutas.

Otra área que deberá tener en cuenta es encontrar sus puntos de vista al crear el controlador. Si planea usar la misma vista para todos ellos, entonces no debería tener que hacer nada diferente a la convención que se usa. Si planea organizar sus vistas también, necesitará crear su propio ViewLocator también y asignarlo al controlador al crearlo en la fábrica de su controlador.

Para tener una idea del código, hay algunas preguntas que he respondido en SO que se relacionan con esta pregunta, pero esta es diferente hasta cierto punto, porque los nombres de los controladores serán los mismos. Incluí enlaces para referencia.

Otra ruta, pero puede requerir algunos compromisos, será usar el nuevo atributo AcceptVerbs. Verifique esta pregunta para más detalles. Todavía no jugué con esta nueva funcionalidad, pero podría ser otra ruta.