Pergunta

Estou tentando criar um site simples.Basicamente tem um controlador Home controlador.

Este controlador tem uma ação Index Leva um string como argumento (que é um diretório) e usa esse 'diretório' para fazer seu trabalho.

Não consigo descobrir como criar uma rota genérica que enviará todos os URLs para esta ação.

Qualquer combinação de URL pode existir e qualquer coisa além do nome de domínio deve ser a string.

http://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred

Alguém sabe como fazer isso?Também não haveria problema se todos os valores fossem passados ​​como uma lista.

Existe um jeito melhor de fazer isso?

Foi útil?

Solução

Tente isto:

routes.MapRoute(
        "Default", "{*path}",
        new { controller = "Home", action = "Index" } 
    );

E o controlador:

public class HomeController : Controller {
    public ActionResult Index(string path) {
        return View();
    }
}

Outras dicas

Meu primeiro pensamento é que isso é uma 'má ideia'.Se você puder pegar qualquer coisa eles podem pedir um URL para você, você terá que ter uma grande lista negra (ou lista branca).São tantas vagas.Uma maneira melhor seria explicar explicitamente essas rotas e como você permite parâmetros e, em seguida, ter ações que lidem com essas rotas aceitas.Você teria então uma rota genérica que redirecionaria para uma página de erro.

Parece que você está tentando misturar maçãs e laranjas.ASP.NET MVC acaba propositalmente com a ideia de 'página'.Não há realmente nenhuma razão para ter diretórios para vários usuários, a menos que você esteja fazendo algum tipo de E/S de arquivo e, se for esse o caso, ele pode ser abstraído para funcionar no paradigma ASP.NET MVC com muito mais facilidade do que você imagina.

Na ASP.NET MVC, se você quiser variar as informações que procura com base na string passada (muito parecida com a string que você passou), aqui está uma maneira 'segura' de fazer isso:

Método #1 – Três Rotas, Três Ações, Nomes Diferentes

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "ShowByYear" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "ShowByYearAndMonth" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "ShowByYearMonthAndName" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

E então você usaria os valores de rota passados ​​em suas ações do controlador para determinar como eles veem os dados:

ShowByYear(string year)
{
    //Return appropriate View here
}

ShowByYearAndMonth(string year, string month)
{ 
    //Return appropriate View here
}

ShowByYearMonthAndName(string year, string month, string name)
{ 
    //Return appropriate View here
}

Método #2 – Método Sugerido

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}", name = "" }
);

Show(string year)
{
    //
}

Show(string year, string month)
{
    //Return appropriate View here
}

Show(string year, string month, string name)
{
    //Return appropriate View here
}

A beleza desta abordagem é que o MapRoute lida com análise de URL;e mantém a ralé fora.Você pode então configurar uma rota abrangente que apenas gere um erro.Você prefere que alguma análise seja feita no lado da rota com regex do que no seu controlador (na minha opinião).

Isso reduz três ações sobrecarregadas e permite um código mais limpo e mais 'MVC'.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top