Передача пользовательских аргументов в контроллеры в mvc3 - PullRequest
0 голосов
/ 15 февраля 2012

Есть ли способ передать аргументы контроллерам при определении таблицы маршрутов?

, поэтому один и тот же контроллер можно использовать для двух или более «секций», например,

http://site.com/BizContacts   // internal catid = 1 defined in the route        
http://site.com/HomeContacts   // internal catid = 3
http://site.com/OtherContacts   // internal catid = 4

и контроллер получает пользовательский аргумент, определенный в таблице маршрутов, для фильтрации и отображения данных с помощью этого дополнительного параметра

, поэтому в приведенном выше примере будет показано действие index, и показанные данные будут возвращены запросом, таким как

 select * from contacts where cat_id = {argument} // 1 or 3 or 4

Надеюсь, это немного ясно

любая помощь приветствуется?

1 Ответ

1 голос
/ 15 февраля 2012

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

public class MyRoute : Route
{
    private readonly Dictionary<string, string> _slugs;

    public MyRoute(IDictionary<string, string> slugs)
        : base(
        "{slug}", 
        new RouteValueDictionary(new 
        { 
            controller = "categories", action = "index" 
        }), 
        new RouteValueDictionary(GetDefaults(slugs)), 
        new MvcRouteHandler()
    )
    {
        _slugs = new Dictionary<string, string>(
            slugs, 
            StringComparer.OrdinalIgnoreCase
        );
    }

    private static object GetDefaults(IDictionary<string, string> slugs)
    {
        return new { slug = string.Join("|", slugs.Keys) };
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }
        var slug = rd.Values["slug"] as string;
        if (!string.IsNullOrEmpty(slug))
        {
            string id;
            if (_slugs.TryGetValue(slug, out id))
            {
                rd.Values["id"] = id;
            }
        }
        return rd;
    }
}

, который может быть зарегистрирован в Application_Start в global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add(
        "MyRoute", 
        new MyRoute(
            new Dictionary<string, string> 
            { 
                { "BizContacts", "1" },
                { "HomeContacts", "3" },
                { "OtherContacts", "4" },
            }
        )
    );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

и, наконец, у вас может быть свой контроллер категорий:

public class CategoriesController : Controller
{
    public ActionResult Index(string id)
    {
        ...
    }
}

Сейчас:

  • http://localhost:7060/bizcontacts выполнит действие Index контроллера Categories и передаст id = 1
  • http://localhost:7060/homecontacts выполнит действие Index контроллера Categories и передаст id = 3
  • http://localhost:7060/othercontacts выполнит действие Index контроллера Categories и передаст id = 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...