Domanda

Sto usando la versione beta di MVC per scrivere una semplice applicazione per comprendere ASP.Net MVC. L'applicazione è un semplice sito di condivisione foto / video con tag. Sto lavorando al progetto scheletro MVC. Ho aggiunto alcuni Html.ActionLink () alla barra di navigazione, ma sto riscontrando un problema con uno degli Html.ActionLink () che ho aggiunto in un punto.

Voglio ~ / Tags per mostrare tutti i tag dal database e voglio ~ / Tag / {tag} per mostrare un elenco di tutti i file che sono taggati con {tag}. Funziona come previsto, ma quando seguo un ~ / Tags / {tag}, cambia Html.ActionLink () nella barra di navigazione in modo che sia uguale al collegamento ~ / Tags / {tag} invece di puntare solo a ~ / Tag. Non capisco perché ActionLink () nella mia barra di navigazione stia cambiando quando seguo ~ / Tags / {tag}. Se passo a un altro collegamento nel progetto, ActionLink () funziona come previsto.

Ho actionlink e route impostati in questo modo. My TagsController ha questa azione Index. L'int? è per un controllo di paging. Ho due viste, una chiamata Tutto e una chiamata Dettagli. Cosa sto sbagliando?

        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) 
        }
È stato utile?

Soluzione

Penso che tu debba gestire un'istanza di yoursite.com/Tags/, poiché ne gestisci solo una con un tag in

Vorrei creare un altro percorso:

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

Altri suggerimenti

Oltre a creare un percorso aggiuntivo come menzionato da Dan Atkinson, dovresti anche sbarazzarti dell'istruzione if nel controller e creare un altro metodo controller (chiamato Dettagli) per gestire i dettagli del tag. se le istruzioni in un controller per determinare quale vista mostrare sono odori di codice. Lascia che il motore di routing faccia il suo lavoro e il codice del tuo controller sarà più semplice e più facile da mantenere.

Ti suggerirei di esaminare le espressioni Lamda per gestirlo, in futuro potresti finire con un 'tag soup'.

Inoltre, assicurarsi di aver scaricato la dll Microsoft.Web.Mvc, diversa da System.Web.Mvc.

Dove trovare Microsoft.Web.Mvc.dll

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top