2013-07-02 36 views
2

我無法讓自定義控制器在Umbraco MVC站點中正常工作。我無法弄清楚如何傳遞自定義模型並使用自定義ActionResults。當我嘗試發送表單時,該方法未被調用。所以像這樣的方法如何在Umbraco中實現自定義控制器6

public ActionResult Home(string username, string password) 
{ 
    Debug.WriteLine("form"); 

    var company = new Company(); 
    return CurrentTemplate(company); 
} 

應該從這樣的形式調用,但沒有任何反應。

@using (Html.BeginForm("Home","Login", FormMethod.Post, new {name = "logon"})) 
{ 
    <label>User name </label><input type="text" id="username"/><br/> 
    <label>Password </label><input type="password" id="password"/><br/> 
    <input type="submit" value="Here"/> 
} 

我知道可以重寫默認控制器,但是有沒有這樣做的意義?

+0

這似乎更多的是一般的asp.net mvc練習比umbraco更適合我的問題。您是否在視圖文件中設置了ViewModel?即@ @模型yournamespace.viewmodels.Company ? –

+2

@Eric Herlitz這是特殊的umbraco。根據文檔,我現在被迫爲每個模板的doctype和actionresult設置一個控制器。我發現它很混亂。 –

回答

1

在一把umbraco,每個請求通過Umbraco.Web.Mvc.RenderMvcController路由,但是你可以重寫這和documentation is here

但是,我建議如果你覺得你需要這樣做,那麼你可能會過度複雜化你的實現。你仍然可以使用你的方法來渲染ChildAction,它可以被賦予一個獨立於Umbraco頁面模型的模型。 See here。這對於渲染分頁搜索結果,文檔列表和您想要在控制器中控制的內容等內容非常有用。我使用這種方法很多,但總是試着回傳一個以IPublishedContent界面爲中心的模型(例如IEnumerable<IPublishedContent>作爲頁面列表),這樣在視圖中,您仍然可以從視圖訪問Umbraco內容和API,而不是必須在模型中實現太多自己的屬性。

當涉及到發佈形式這是一個有點比較麻煩,因爲你有兩個選擇:

  1. 作爲丹DIPLO說,你可以使用Html.BeginUmbracoForm()方法;或
  2. 您可以以標準MVC方式發回到[HttpPost]動作,即Html.BeginForm()

(2)的挑戰是因爲所有的請求都通過了Umbraco.Web.Mvc.RenderMvcController,所以你不能告訴表單要發送到哪個頁面。您只能張貼自己或非Umbraco控制的動作。例如,您可以讓表單發回到同一頁面,並專門爲[HttpPost]準備第二個ChildAction。與此相關的問題是,它會捕獲所有帖子,無論發佈的表單是什麼。個人而言,我在大多數標準形式中使用方法(1),其中我需要直接與Umbraco進行交互,例如,查詢,上傳等,當我需要更多控制時,我使用方法(2)。但是這通常需要更多的思考。

+0

謝謝。你是對的,我過於複雜了。 –

1

你是真的想要一個自定義控制器,還是實際上只是想使用MVC在Umbraco中創建一個窗體?如果是後者,則需要使用surface controller即。確保您的控制器繼承自Umbraco.Web.Mvc.SurfaceController並具有後綴「SurfaceController」。

public class MySurfaceController : Umbraco.Web.Mvc.SurfaceController 
{ 
    public ActionResult Index() 
    { 
     return Content("hello world"); 
    } 
} 

然後,您需要使用自定義一把umbraco的HTML幫助創建表單標籤:

@using(Html.BeginUmbracoForm("CreateComment", "BlogPostSurface")) 
{ 
// 
} 

http://our.umbraco.org/documentation/Reference/Mvc/forms

+1

謝謝丹,我其實想要能夠控制一切。目前我需要爲每個文檔類型設置1個控制器,然後爲每個模板設置一個動作結果,這讓我感到困惑。有沒有辦法使用我自己的控制器和方法來控制它? –

1

舊帖子,但我想我會添加我目前正在工作的項目中的發現。@Digbyswift說,對於文章,正如你在表單中提到的那樣,對於大多數實例你需要一個SurfaceController。

但是 - 這是我最麻煩的地方。我有一個表單發佈到另一個頁面,該頁面顯示結果,然後在視圖上顯示該數據。我想擺脫使用query strings並將數據放入session等等,因爲我們使用的是MVC。這也允許我返回一個也使用CurrentPage的自定義視圖,您需要將RenderModel作爲model。我們將需要設置一些東西:

1)創建您的控制器,視圖和文檔類型。在這種情況下,我處理瓦特/「成員」,所以我創建了一個Member文檔類型,MemberController

2)就認爲調職形式:

 <form method="post" action="member"> 
      <div class="form-group"> 
       <input type="text" id="query" name="query" class="form-control" placeholder="Member Company or State" /> 
      </div> 
      <input type="submit" value="Search" class="button button-green" /> 
     </form> 

你也可以在繼承ApplicationEventHandler類的類中定義一個自定義路由,並在ApplicationStarted事件中註冊路由,但這樣我們只會覆蓋Index操作。

3)在控制器上,MemberController

public class MemberController : RenderMvcController 
{ 
    [EnsurePublishedContentRequest(2303)] // 2303 is your node ID 
    public ActionResult Index(string query) 
    { 
     // your code - assign to ViewBag 

     return View("~/Views/Member.cshtml", this.CreateRenderModel(Umbraco.TypedContent(2303))); 
    } 
} 

private RenderModel CreateRenderModel(IPublishedContent content) 
{ 
    var model = new RenderModel(content, CultureInfo.CurrentUICulture); 

    //add an umbraco data token so the umbraco view engine executes 
    RouteData.DataTokens["umbraco-doc-request"] = model; 

    return model; 
} 

請勿必須這樣做,如果你沒有需要作出的任何macros做。在我的情況下,我有這個繼承了_layout的視圖。

Custom MVC Routes in Umbraco

我們在這裏做(2)的事情。一個是確保我們得到PublishedContentRequest

第二部分是獲取RenderModel對象。我讀了很多文章,其中您的基本模型應該從RenderModel繼承,並添加一些默認的Umbraco構造函數,但我沒有很好的運氣。

希望這有助於某人。

相關問題