如何在Umbraco 6中实现自定义控制器

时间:2013-07-02 14:49:03

标签: c# asp.net-mvc umbraco

我无法让我的自定义控制器在Umbraco MVC网站中正常运行。我无法弄清楚如何传递自定义模型并使用自定义ActionResults。当我尝试发送表单时,该方法未被调用。所以像这样的方法

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"/>
}

我知道可以覆盖默认控制器但这样做有什么意义吗?

3 个答案:

答案 0 :(得分:2)

旧帖子,但我想我会在当前正在进行的项目中添加我的发现。

对于帖子,正如您在表单中所指的那样,对于大多数情况,您需要一个SurfaceController,如@Digbyswift所说。

HOWEVER - 这是我遇到的最麻烦的地方。我有一个表单发布到另一个页面,显示结果,然后在视图上显示该数据。我想放弃使用query strings并将数据放入session等,因为我们正在使用MVC。这也允许我返回使用CurrentPage的自定义视图,您需要RenderModel作为model。我们需要设置一些东西:

1)创建控制器,视图和文档类型。在这种情况下,我正在处理w /&#34;成员&#34;,因此我创建了Member doc类型,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事件中注册路由,但这样我们只会覆盖{{1行动。

3)在控制器上Index

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; } ,则不要必须这样做。在我的情况下,我有这个继承了_layout的观点。

Custom MVC Routes in Umbraco

我们必须做(2)这里的事情。一个是确保我们获得macros

第二部分是获取PublishedContentRequest对象。我阅读了很多文章,其中你的基础模型应该从RenderModel继承,并添加一些默认的Umbraco构造函数,但我没有太多运气。

希望这有助于某人。

答案 1 :(得分:1)

你真的是说你想要一个自定义控制器,或者你真的只想在Umbraco中使用MVC创建一个表单吗?如果它是后者那么你需要使用surface controller即。确保您的控制器继承自Umbraco.Web.Mvc.SurfaceController并具有后缀&#39; SurfaceController&#39;。

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

答案 2 :(得分:1)

在Umbraco中,每个请求都会通过Umbraco.Web.Mvc.RenderMvcController进行路由,但您可以覆盖此documentation is here

但是,我建议如果您觉得需要这样做,那么您可能会过度复杂化您的实现。您仍然可以使用您的方法渲染ChildActions,可以为Umbraco页面模型提供独立的模型。 See here。这非常适合渲染分页搜索结果,文档列表和您希望能够在控制器中控制的内容。我经常使用这种方法,但总是尝试传回一个以IPublishedContent界面为中心的模型(例如IEnumerable<IPublishedContent>用于页面列表),这样在View中,你仍然可以访问Umbraco来自View的内容和API,而不必在模型中实现太多自己的属性。

当发布表单时,它有点棘手,因为你有两个选择:

  1. 正如Dan Diplo所说,你可以使用Html.BeginUmbracoForm()方法;或
  2. 您可以使用标准MVC方式回发[HttpPost]行动,即Html.BeginForm()
  3. (2)的挑战是因为所有请求都是通过Umbraco.Web.Mvc.RenderMvcController传递的,所以你无法告诉表单要发布哪个页面。您只能发布自己或非Umbraco控制的操作。例如,您可以让表单回发到同一页面,并为[HttpPost]专门设置第二个ChildAction。这个问题是它会捕获所有帖子,无论从哪个表单发布。

    就个人而言,我使用大多数标准形式的方法(1),我需要直接与Umbraco互动,例如查询,上传等,当我需要更多控制时,我使用方法(2)。但这通常需要更多的思考。