HTML. Конструкция ActionLink неправильно связывается, когда маршрут non-mvc добавляется

Это должно работать обоснованно хорошо:

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/миллион, миллиард, и т.д.)

8
задан Martin Brown 10 February 2014 в 16:13
поделиться

2 ответа

Попробуйте:

<%=Html.RouteLink("Test", "Default", new {controller = "Controller", action = "Action"})%>

Использование RouteLink вместо ActionLink позволяет указать маршрут, который вы хотите использовать, который в данном случае является сопоставлением маршрутов MVC по умолчанию в отличие от добавленного вами пользовательского. .

3
ответ дан 5 December 2019 в 11:25
поделиться

Альтернативный вариант - добавить настраиваемое ограничение к вашим 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")));

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

7
ответ дан 5 December 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: