Pergunta

Eu estou usando o beta MVC para escrever um aplicativo simples de entender ASP.Net MVC. O aplicativo é um site de compartilhamento de foto / vídeo simples com marcação. Eu estou trabalhando fora do projeto do MVC esqueleto. Eu adicionei alguns Html.ActionLink () é a barra de navegação, mas eu estou tendo um problema com um dos Html.ActionLink () é que eu adicionei em um ponto.

Eu quero ~ / Tags para mostrar todas as tags do banco de dados e eu quero ~ / Tags / {tag} para mostrar uma listagem de todos os arquivos que são marcados com {tag}. Isso funciona como esperado, mas quando eu siga a ~ / Tags / {tag}, ele muda o Html.ActionLink () na barra de navegação para ser o mesmo que o Tag {tag} ligação ~ / / em vez de apenas apontando para ~ /Tag. Eu não estou entendendo por que o ActionLink () na minha barra de navegação está mudando quando eu seguir o ~ / Tags / {tag}. Se eu navegar para uma ligação diferente no projeto, o ActionLink () funciona como esperado.

Eu tenho o actionlink e via configurado como este. Meu TagsController tem esta ação Index. O int? é para um controlo de paging. Eu tenho duas exibições, uma chamada All e um chamado detalhes. O que estou fazendo de errado?

        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) 
        }
Foi útil?

Solução

Eu acho que você precisa lidar com uma instância de yoursite.com/Tags/, como você está lidando com apenas um com uma etiqueta na.

Gostaria de criar um outro caminho:

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);
}

Outras dicas

Além de criar uma rota adicional como Dan Atkinson menciona, você também deve se livrar da instrução if no controlador e criar um outro método de controlador (chamado Detalhes) para lidar com os detalhes da etiqueta. se as declarações em um controlador para determinar qual visualização show são um cheiro de código. Deixe o mecanismo de roteamento fazer o seu trabalho e seu código controlador será mais simples e mais fácil de manter.

eu sugiro que você olhar para expressões Lamda para lidar com isso, você pode acabar com uma 'sopa tag' no futuro.

Além disso, certifique-se de ter baixado o dll Microsoft.Web.Mvc, difere de System.Web.Mvc.

onde obter Microsoft.Web.Mvc.dll

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