Здесь у вас есть ленивая оцененная версия этого алгоритма, закодированная в C #:
static bool nextCombination(int[] num, int n, int k)
{
bool finished, changed;
changed = finished = false;
if (k > 0)
{
for (int i = k - 1; !finished && !changed; i--)
{
if (num[i] < (n - 1) - (k - 1) + i)
{
num[i]++;
if (i < k - 1)
{
for (int j = i + 1; j < k; j++)
{
num[j] = num[j - 1] + 1;
}
}
changed = true;
}
finished = (i == 0);
}
}
return changed;
}
static IEnumerable Combinations<T>(IEnumerable<T> elements, int k)
{
T[] elem = elements.ToArray();
int size = elem.Length;
if (k <= size)
{
int[] numbers = new int[k];
for (int i = 0; i < k; i++)
{
numbers[i] = i;
}
do
{
yield return numbers.Select(n => elem[n]);
}
while (nextCombination(numbers, size, k));
}
}
И тестовая часть:
static void Main(string[] args)
{
int k = 3;
var t = new[] { "dog", "cat", "mouse", "zebra"};
foreach (IEnumerable<string> i in Combinations(t, k))
{
Console.WriteLine(string.Join(",", i));
}
}
Надеюсь, это поможет вам!
Что-то вроде этого для контроллера:
string controller = RouteData.GetRequiredString("controller");
И для действия:
string action = RouteData.GetRequiredString("action");
Например, вы можете использовать его в своем базовом классе контроллера:
public class YouControllerBase: Controller
{
protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
string controller = requestContext.RouteData.GetRequiredString("controller");
string action = requestContext.RouteData.GetRequiredString("action");
}
}
Или используйте его в global.asax:
protected void Application_BeginRequest(object sender, EventArgs e)
{
RouteData routeData = RouteTable.Routes.GetRouteData(
new HttpContextWrapper(HttpContext.Current));
var action = routeData.GetRequiredString("action");
}
Это зависит от маршрутов, которые зарегистрированы для разрешения URL.
По умолчанию приняты следующие правила:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
Действие индекса будет вызываться для HomeController.
Можно попробовать вот это ASP.NET Routing Debugger:
(источник: haacked.com)
pete,
в коде, вы можете использовать фильтр действий, чтобы определить, что происходит:
public class AddUrlInfoToSessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
{
// where we are now - do something with the vars in real app
var currentActionName = filterContext.ActionDescriptor.ActionName;
var currentControllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var currentRouteData = filterContext.RouteData;
var currentUrlInfo = new UrlHelper(filterContext.RequestContext);
string url = RouteTable.Routes.GetVirtualPath(filterContext.RequestContext, currentRouteData.Values).VirtualPath;
}
}
}
, а затем украсить каждый контроллер, который вас интересует, как показано ниже (или поместить его в базовый контроллер):
[HandleError]
[AddUrlInfoToSessionAttribute]
public class HomeController : Controller
{
// controller stuff
}
[AddUrlInfoToSession]
public abstract class BaseController : Controller
{
}
надеюсь, что это помогает
Джим
РЕДАКТИРОВАТЬ: просто немного привел в порядок пример, добавив к методу фильтра следующее:
string url = RouteTable.Routes.GetVirtualPath (filterContext.RequestContext, currentRouteData.Values). VirtualPath;
Два простых шага:
MvcFakes.dll, RouteDebugger.dll
/RouteDebugger
Эти 2 dll содержатся здесь
Chapter09Code.zip\Code\CS\MvcApplication1\MvcApplication1\bin
Контроллер и действие, которые используются, определяются зарегистрированными маршрутами . Загляните в свой Global.ascx.cs
Вот отображение маршрута по умолчанию, которое входит в стандартную комплектацию нового приложения MVC. Итак, если ваш URL-адрес http: // yourdomain / SomeSiteSection / SomeThing / , тогда MVC будет искать контроллер с именем SomeSiteSectionController и действие с именем SomeThing.
public class MvcApplication : System.Web.HttpApplication
{
//...
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}