Orchard: Пользовательские поля регистрации

Для моего проекта Orchard мне нужна дополнительная информация от пользователя во время регистрации. (Скажите, Имя, Фамилия, Цвет Штанов). Эта информация должна быть введена при регистрации и не может быть отложена до более позднего времени (согласно распоряжениям клиента).

Я пытался использовать плагины "Профиль" и "Расширенная регистрация", чтобы запросить их, но, насколько я вижу, это дает мне только дополнительные поля для отображения в форме регистрации. Есть ли способ представить поля, которые являются обязательными?

У меня также была быстрая попытка переписать AccountController's Register метод, согласно этому обсуждению, но я не мог заставить его работать: контроллер находится в другом месте, он не может быть разделен на подклассы, и даже если я заставлю его, код никогда не будет выполнен. Я предполагаю, что они используют гораздо более старую версию Orchard.

Итак, в каком направлении мне следует создать обязательное поле, близкое к философии Орчард? Должен ли я создать новый тип поля, который может отклонить пустые значения, может быть? (это вообще возможно)?

2 ответа

Решение

Я написал модуль ExtendedRegistration из-за той же необходимости. Вам необходимо создать собственную деталь, например: MyRegistrationPart. Затем вы добавляете эту часть в User ContentType. Со своей стороны просто добавьте атрибут [Обязательный] (аннотации данных) к любым обязательным свойствам. Регистрация не будет успешной, пока эти обязательные значения не будут заполнены!

Надеюсь, теперь все ясно.

Хотя это, вероятно, не ответит на ваш вопрос, я просто хотел указать, что, насколько я понимаю, вам не нужно переопределять / создавать подкласс класса AccountController. Вместо этого вам нужно "перезаписать" Users/Account/Register маршрут, добавив свой собственный с более высоким приоритетом. Для этого вам нужно реализовать IRouteProvider как часть нашего модуля. Так как это IDependency, он будет загружаться и обрабатываться автоматически во время выполнения. Что-то вроде:

public class Routes : IRouteProvider
{
    public void GetRoutes(ICollection<RouteDescriptor> routes)
    {
        routes.AddRange(GetRoutes());
    }

    public IEnumerable<RouteDescriptor> GetRoutes()
    {
        return new[] {
            new RouteDescriptor {
                // Make sure to be higher than the default
                Priority = ##### PRIORITY HERE (int) ######,
                Route = new Route(
                "Users/Account/Register",
                new RouteValueDictionary {
                    {"area", "#### YOUR MODULE AREA HERE ####"},
                    {"controller", "#### YOUR ACCOUNT CONTROLLER HERE ####"},
                    {"action", "#### YOUR REGISTER ACTION HERE ####"}
                },
                new RouteValueDictionary(),
                new RouteValueDictionary {
                    {"area", "#### YOUR MODULE AREA HERE ####"}
                },
                new MvcRouteHandler())
            }
        };
    }
}
Другие вопросы по тегам