Перенаправление на другой контроллер + действие без изменения URL в ASP.Net MVC3 - PullRequest
6 голосов
/ 10 июля 2011

Примечание : Ниже приведен небольшой демонстрационный пример для имитации того, что я ищу:

Ниже приведен формат URL в моем приложении, который может видеть пользователь

mydomain.com/cat/1  --display cat with id 1 |controller=Cat, action=DisplayDetails
mydomain.com/dog/2  --display dog with id 2 |controller=Dog, action=DisplayDetails
mydomain.com/cow/2 --display cow with id 3  |controller=Cow, action=DisplayDetails

Я поддерживал систему, в которой никакие 2 животных (могут быть разного вида) могут иметь одинаковый идентификатор, это означает, что если есть кошка с id = 1, у нас не может быть другого животного с таким идентификатором. Также из моей системы я могу извлечь данные о животных + тип только из идентификатора животного

Помимо существующего шаблона URL, я планирую создать короткий URL в формате, указанном ниже

mydomain.com/1  --this will show cat
mydomain.com/2  --this will show dog
mydomain.com/3  --this will show cow

Маршруты, которые я создал, описаны ниже, и они выглядят в том же порядке в global.asax

pattern= Cat/{id}, controller= Cat, action=DisplayDetails
pattern= Dog/{id}, controller= Dog, action=DisplayDetails
pattern= Cow/{id}, controller= Cow, action=DisplayDetails
pattern= {id}, controller= DisplayAnyAnimal ----------i want help in this Route

В настоящее время контроллер выглядит следующим образом

public class DisplayAnyAnimalContoller : Controller
{
      public ActionResult Index(string animalId)
      {
           //iam processing request here from animalId
           //now i know which contoller+action needs to be executed

          //say for instant i have to display dog with id=2

          //currently iam doing this to redirect and its working fine, 
          //but it changes url
          -----------------------------------------------
          #########################
          ### i need help here  ###       
          #########################
         return RedirectToRoute(new {contoller="Dog",action="DisplayDetails",id=2 });             
          -----------------------------------------------
      }
}

Теперь проблема с RedirectToRoute / RedirectToAction в том, что они оба меняют URL. Но я не хочу менять свой шаблон URL.

Пожалуйста, предложите мне, как этого достичь, вы можете предложить какой-то совершенно другой способ достичь этого

1 Ответ

6 голосов
/ 10 июля 2011

Вы можете написать собственный маршрут для животных:

public class AnimalRoute : Route
{
    public AnimalRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler)
    { }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        var id = rd.GetRequiredString("id");

        // TODO: Given the id decide which controller to choose:
        // you could query the database or whatever it is needed.
        // Basically that will be the code you had in the beginning
        // of the index action of your DisplayAnyAnimalContoller which
        // is no longer needed.
        if (id == "1")
        {
            rd.Values["controller"] = "Cat";
        }
        else if (id == "2")
        {
            rd.Values["controller"] = "Dog";
        }
        else if (id == "3")
        {
            rd.Values["controller"] = "Cow";
        }
        else
        {
            // no idea what this animal was
            throw new HttpException(404, "Not found");
        }
        rd.Values["action"] = "index";
        return rd;
    }
}

и зарегистрируйте его в Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.Add(new AnimalRoute("{id}", new MvcRouteHandler()));
}

Теперь, когда вы перейдете к mydomain.com/1, будет выполнен метод GetRouteData пользовательского маршрута, который извлечет id = 1 и затем будет использовать действие Index контроллера Cat. 1012 *

...