开发者

Orchard: Custom Registration fields

开发者 https://www.devze.com 2023-03-12 00:00 出处:网络
For my Orchard project, I need some additional information from the user at registration time. (Say, First Name, Last Name, Pants Color). This information must be entered while registering and can not

For my Orchard project, I need some additional information from the user at registration time. (Say, First Name, Last Name, Pants Color). This information must be entered while registering and can not be deferred until later (as per client's orders).

I tried using the Profi开发者_开发问答le and Extended Registration plugins to ask for those, but as far as I see, this only gives me optional fields to display in the registration form. Is there a way to present fields that are mandatory?

I also had a quick foray into overwriting the AccountController's Register method, as per this discussion, but I couldn't get it to work: The controller is in a different place, it can't be subclassed and even if I force it to, code is never executed. I presume they are using a much older version of Orchard.

So, in which direction should I go to create a mandatory field that is close to the Orchard philosophy? Should I create a new field type that rejects empty values maybe? (is that even possible)?


I wrote the ExtendedRegistration module because of that same need. You need to create a custom part, e.g.: MyRegistrationPart. Then you add that part to the User ContentType. In your part just add the [Required] attribute (Data annotations) to any properties that are mandatory. Registration will not succeed until those mandatory values have been filled out!

Hope it's clear now.


While this probably won't answer your question just wanted to point out that it is my understanding that you don't need to override/subclass the AccountController class. Instead you need to "overwrite" the Users/Account/Register route by adding your own with a higher priority. To do that you need to implement an IRouteProvider as part of our module. Since it's an IDependency it will be loaded and processed automagically at run time. Something like:

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())
            }
        };
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消