Orchard: 自定义注册字段

5
对于我的Orchard项目,我需要在注册时从用户那里获取一些额外的信息(例如名字、姓氏和裤子颜色)。这些信息必须在注册时输入,不能推迟到以后(按照客户的要求)。
我尝试使用Profile和Extended Registration插件来询问这些信息,但据我所见,这只给我提供了可选字段以显示在注册表单中。有没有办法呈现强制性的字段?
我还尝试过重写AccountController的Register方法,如此讨论所述,但我无法使其工作:控制器位于不同的位置,无法进行子类化,即使我强制执行,代码也永远不会被执行。我想他们正在使用一个更旧的版本的Orchard。
那么,我应该朝着哪个方向去创建一个接近Orchard哲学的强制性字段呢?我应该创建一个拒绝空值的新字段类型吗?(这是可能的吗)?
2个回答

6
我写了ExtendedRegistration模块,是因为有同样的需求。 您需要创建一个自定义部分,例如:MyRegistrationPart。 然后将该部分添加到User ContentType中。 在您的部件中,只需为任何必填属性添加[Required]属性(数据注释)。 除非填写了这些必填值,否则无法成功注册! 希望现在清楚了。

谢谢,那就是我最终做的。哦,还要感谢你编写那个模块。 - winsmith

3

虽然这可能不能完全回答你的问题,但我想指出的是,据我所知,你不需要覆盖/子类化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())
            }
        };
    }
}

我可以补充说,尝试实际覆盖控制器方法会很麻烦,可能不值得。今天我学到了... - winsmith
谢谢Ivan!我使用了这种方法来“覆盖”到用户/帐户/访问被拒绝的路由,以便能够自己处理渲染登录页面。此外,看起来Orchard 1.4使用路径OrchardLocal / Users / Account / LogOn来处理实际的登录。 - Josh Noe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接