2011-06-07 143 views
5

對於我的Orchard項目,我需要用戶在註冊時提供一些附加信息。 (說,名字,姓氏,褲子顏色)。這些信息必須在註冊時輸入,並且不能推遲到以後(根據客戶的訂單)。Orchard:自定義註冊字段

我試過使用配置文件和擴展註冊插件來要求這些,但據我所知,這隻給我可選的字段顯示在註冊表單中。有沒有辦法提供強制性的字段?

我也很快進入了根據this discussion覆蓋AccountController的Register方法,但我無法實現它:控制器處於不同的位置,它不能被子類化,即使我強制它來說,代碼永遠不會被執行。我認爲他們正在使用一個更舊版本的果園。

那麼,我應該在哪個方向創建一個接近果園哲學的必填字段?我應該創建一個拒絕空值的新字段類型嗎? (甚至可能)?

回答

6

因爲同樣的需要,我寫了ExtendedRegistration模塊。 您需要創建一個自定義部分,例如:MyRegistrationPart。 然後將該部分添加到用戶ContentType。 在您的部分中,只需將[必需]屬性(數據註釋)添加到任何必需的屬性。 註冊將不會成功,直到填寫完這些必填項!

希望現在很清楚。

+0

謝謝,這就是我最終做的。哦,非常感謝你寫這個模塊。 – winsmith 2011-06-09 08:30:57

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

我可以補充一點,試圖實際覆蓋一個控制器方法是很麻煩,可能不值得。今天我學到了...... – winsmith 2011-06-07 17:46:50

+0

謝謝伊萬!我使用這種方法來「覆蓋」到Users/Account/AccessDenied的路由,所以我可以自己處理登錄頁面的呈現。另外,它看起來像Orchard 1.4使用路徑OrchardLocal/Users/Account/LogOn來處理實際登錄。 – 2012-08-20 14:24:11