【问题标题】:Umbraco, POST when inheriting from RenderMVCControllerUmbraco,从 RenderMVCController 继承时的 POST
【发布时间】:2014-02-14 04:47:37
【问题描述】:

我在 Umbraco 中设置了一个文档类型,并为此文档类型创建了一个自定义控制器和模型。

自定义控制器继承自:RenderMvcController类,视图通过@inherits Umbraco.Web.Mvc.UmbracoViewPage<com.something.model>继承模型

这一切都适用于任何HttpGet 请求。但是,只要我想使用@using (Html.BeginUmbracoForm("SomeAction", "SomeController", null, new { @class = "some-class" })) 将表单发回控制器

我收到以下错误消息:Could not find a Surface controller route in the RouteTable for controller name SomeController

从我能找到的所有文档中,当涉及到表单帖子时,它总是指 SurfaceControllers。有没有办法改变路由,让它发布到我的自定义控制器,而不是另一个继承自 SurfaceController 类的控制器?

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc umbraco


    【解决方案1】:

    你需要从Umbraco.Web.Mvc.SurfaceController继承你的Controller

    您可以像这样在控制器中执行此操作:

    public class DefaultController : Umbraco.Web.Mvc.SurfaceController
    {
       Public ActionResult YourMethod()
       {
           return CurrentUmbracoPage();
       }
    }
    

    在视图中,您将表单称为:

    @using (Html.BeginUmbracoForm("YourMethod", "Default",new { @class = "YourclassName" }))
    {
        //DO Something
    }
    

    现在最后一步是在 App_Start 文件夹的 RouteConfig.cs 中定义您的路线

     public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Default", action = "YourMethod", id = UrlParameter.Optional }
                );
            }
        }
    

    【讨论】:

      【解决方案2】:

      尝试将其用于您的表单:

      @using (Html.BeginUmbracoForm("Post", "ControllerNameWithoutController", System.Web.Mvc.FormMethod.Post, new { @class = "YourclassName" }))
      

      你的控制器也必须继承自 SurfaceController

       public class YourControllerNameController : SurfaceController
      

      【讨论】:

        【解决方案3】:

        我相信这是一个很好的解决方案,可以让 get 和 post 动词到同一个控制器。由于您不能同时继承 RenderMvcController 和 SurfaceController,所以我发现这更好,它还允许使用 RenderModel 填充表单元素。

         public class ContactUsController : SurfaceController, IRenderController
        

        【讨论】:

        • 还要将视图模型传回(就像在普通 mvc 中一样),你需要在你的模型中使用类似的东西 public ContactUsViewModel() : this(new UmbracoHelper(UmbracoContext.Current).TypedContent(UmbracoContext .Current.PageId)) { } public ContactUsViewModel(IPublishedContent content) : base(content) { }
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2018-02-03
        相关资源
        最近更新 更多