Это должно работать обоснованно хорошо:
public static class HumanFriendlyInteger
{
static string[] ones = new string[] { "", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };
static string[] teens = new string[] { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };
static string[] tens = new string[] { "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
static string[] thousandsGroups = { "", " Thousand", " Million", " Billion" };
private static string FriendlyInteger(int n, string leftDigits, int thousands)
{
if (n == 0)
{
return leftDigits;
}
string friendlyInt = leftDigits;
if (friendlyInt.Length > 0)
{
friendlyInt += " ";
}
if (n < 10)
{
friendlyInt += ones[n];
}
else if (n < 20)
{
friendlyInt += teens[n - 10];
}
else if (n < 100)
{
friendlyInt += FriendlyInteger(n % 10, tens[n / 10 - 2], 0);
}
else if (n < 1000)
{
friendlyInt += FriendlyInteger(n % 100, (ones[n / 100] + " Hundred"), 0);
}
else
{
friendlyInt += FriendlyInteger(n % 1000, FriendlyInteger(n / 1000, "", thousands+1), 0);
if (n % 1000 == 0)
{
return friendlyInt;
}
}
return friendlyInt + thousandsGroups[thousands];
}
public static string IntegerToWritten(int n)
{
if (n == 0)
{
return "Zero";
}
else if (n < 0)
{
return "Negative " + IntegerToWritten(-n);
}
return FriendlyInteger(n, "", 0);
}
}
(Отредактированный для исправления ошибки w/миллион, миллиард, и т.д.)
Попробуйте:
<%=Html.RouteLink("Test", "Default", new {controller = "Controller", action = "Action"})%>
Использование RouteLink вместо ActionLink позволяет указать маршрут, который вы хотите использовать, который в данном случае является сопоставлением маршрутов MVC по умолчанию в отличие от добавленного вами пользовательского. .
Альтернативный вариант - добавить настраиваемое ограничение к вашим WebFormRoute (ами). Например, вы можете создать реализацию IRouteConstraint для соответствия RouteDirection.IncomingRequest, а затем использовать ее, чтобы гарантировать, что маршрут игнорируется созданными сервером маршрутами (такими как ActionLink), но по-прежнему используется запросами, созданными клиентом. Что-то вроде:
public class IncomingOnlyRouteConstraint: IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest)
{
return true;
}
return false;
}
}
А затем добавьте ограничение к вашему маршруту:
routes.Add("AspxRoute", new Route("Upload/New", null,
new RouteValueDictionary() { {"WebFormsConstraint", new IncomingOnlyRouteConstraint()} },
new WebFormRouteHandler<Page>("~/Uploads.aspx")));
Конечно, вы можете предпочесть добавить свой собственный стиль ограничения, это довольно ограничивает маршрут, который его реализует, но это всего лишь пример одного способ решения проблемы.