Asp.Net MVC много констант для обработки перенаправлений контроллера / действия - PullRequest
2 голосов
/ 07 июня 2011

Это только я или кого-то еще раздражал тот факт, что нам приходится использовать множество констант для обработки перенаправлений с одного действия на другое на разных контроллерах.Я пытался реализовать подход, основанный на отражении, для решения этой проблемы, но мне было интересно, как другие подошли к этому (конечно, если вы рассматривали это как проблему :))

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

  public static string ActionName(Func<ActionResult> methodContainer)
        {
            return methodContainer.Method.Name;
        }

и, чтобы получить имя контроллера,

   public static string ControllerName<T>() where T : class
        {
            Type t = typeof (T);
            return t.Name.Replace(ControllerConstants.Controller, string.Empty);
        }

Есть ли более подходящие подходы, чем этот?

/ Шмель

Ответы [ 4 ]

2 голосов
/ 07 июня 2011

Ознакомьтесь с библиотекой MVCContrib, ссылка ниже решает именно ту проблему, с которой вы имеете дело ... она существует со времен MVC v1.

http://mvccontrib.codeplex.com/wikipage?title=RedirectToAction&referringTitle=Documentation

Он также есть на nuget, поэтому его легко раскрутить.

http://nuget.org/List/Packages/MvcContrib.Mvc3-ci

1 голос
/ 07 июня 2011

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

string ActionLink<TController, T>(Expression<Func<TController,T>> actionExpression, bool useQueryString = false)
        {
            var controllerName = typeof(T).Name;
            const string controllerPostfix = "Controller";
            if (controllerName.EndsWith(controllerPostfix, StringComparison.InvariantCultureIgnoreCase))
            {
                controllerName = controllerName.Substring(0, controllerName.Length - controllerPostfix.Length);
            }
            var expBody = (MethodCallExpression)actionExpression.Body;
            var method = expBody.Method;
            var parameters = method.GetParameters().ToArray();
            var arguments = string.Empty;
            if (useQueryString){
                arguments = GetQuerystring(expBody, parameters);
            } else{
                if (parameters.Length > 0)
                {
                    arguments = "/" + string.Join
                                            ("/",
                                             expBody.Arguments.Select
                                                 ((arg, i) => string.Format("{0}",GetValue(arg))).
                                                 ToArray());
                }

            }
            return "~/" + controllerName + "/" + expBody.Method.Name + arguments;
        }

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

ACtionLink ((MyController c => c.ShowMeTheMoney (ThreatenWithGun: false, Shout: true));

возможно и вернет "~ / My / ShowMeTheMoney / false / true". Таким образом, не требуется больших усилий, чтобы превратить безопасное выражение типа в строку (или любой другой формат), когда это необходимо, и большую часть того, что необходимо сделать, можно повторно использовать в совершенно разных сценариях (таких как метод GetValue, использованный выше). который способен обходить дерево выражений, чтобы получить значение, представленное этим деревом выражений)

0 голосов
/ 07 июня 2011

Ваш метод извлечения имени действия просто неверен. Если вы используете атрибут ActionName в своих действиях, ваш метод вернет неправильное имя действия. Если вы хотите исключить использование строк и прилагать меньше усилий для написания констант, попробуйте T4MVC . Это просто избавит от необходимости записи констант в asp.net mvc. Он автоматически генерирует константы для имен контроллеров, имен представлений, имен действий и т. Д.

0 голосов
/ 07 июня 2011

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

Надеюсь, это поможет

...