Html.Action()导致“路由表中没有路由匹配提供的值”

时间:2013-11-17 15:11:45

标签: asp.net-mvc asp.net-mvc-routing umbraco6

这个问题已经多次讨论过,但我没有找到针对我的具体案例的解决方案。

在我的一个Umbraco(6)视图中,我使用

调用控制器方法
@Html.Action("Index", "CountryListing");

这导致“路由表中没有路由”异常。

我一直在使用RegisterRoutes方法摆弄无济于事。我想知道它是否甚至被用作当我清空RegisterRoutes方法时网站仍然起作用。这就是现在的样子:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

我也试过像这样添加一个空的“区域”

@Html.Action("Index", "CountryListing", new {area: String.Empty});

我在其他地方使用@ Html.Action语句并且它们可以工作,所以我确实理解为什么其中一些工作而其他人没有工作,但现在的主要问题是让我的国家列出行动起作用。

2 个答案:

答案 0 :(得分:3)

您可以通过执行以下操作来解决此问题

  1. 确保您的Controller正在扩展Umbraco的SurfaceController
  2. 将其命名为YourName * SurfaceController *
  3. 将[PluginController(“CLC”)]'annotation'(我来自Java)添加到您的控制器。 CLC代表CountryListController。你当然可以自己组建名字。
  4. 将PluginController名称(CLC)作为“Area”参数添加到Html.Action调用。
  5. 我的控制器:

    [PluginController("CLC")]
    public class CountryListingSurfaceController : SurfaceController
    {
        public ActionResult Index()
        {
           var listing = new CountryListingModel();
    
           // Do stuff here to fill the CountryListingModel
    
           return PartialView("CountryListing", listing);
        }
    }
    

    我的部分视图(CountryListing.cshtml):

    @inherits UmbracoViewPage<PatentVista.Models.CountryListingModel>
    
    @foreach (var country in Model.Countries)
    {
        <span>More razor code here</span>  
    }
    

    行动召唤:

    @Html.Action("Index", "CountryListingSurface", new {Area= "CLC"})
    

答案 1 :(得分:0)

您可以使用null而不是使用String.empty

@Html.Action("Index", "CountryListing",null);

如果您正在使用区域,则必须覆盖每个区域的RegisterRoutes

public override string AreaName
    {
        get
        {
            return "CountryListing";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "CountryListing_default",
            "CountryListing/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }

我建议你看看同样的问题: https://stackoverflow.com/a/11970111/2543986