Html.RenderAction正常工作,但直接请求返回404

时间:2016-03-29 09:23:09

标签: asp.net asp.net-mvc asp.net-mvc-areas

我正在开发具有多个领域的MVC应用程序。一切正常,但我无法显示其中一个区域的内容,即Scheme

在快捷方式中,这个:

@Html.ActionLink("Show error page", "Index", "Error", new { area="Scheme" });}

返回404,直接在浏览器中输入host/Scheme/Error/

然而!这样:

@{Html.RenderAction("Index", "Error", new { area="Scheme" });}

在布局页面上正确呈现操作结果内容并按预期显示。

我在这个区域的每个控制器中都注意到了同样的行为。

  • 我在应用程序启动时调用了RegisterAllAreas()方法
  • 我在RouteConfig中删除了RegisterRoutes()的内容(虽然我不知道它做了什么,只是按照教程)。
  • 我检查了一百万次,这个区域中的控制器名称空间与RegisterArea()方法中的名称空间匹配。
  • 在显示404之前,应用程序会抛出错误:"路径控制器&#scheme / Error / Index'没有找到或没有实现IController。" (用Google搜索,互联网上没有任何解决方案符合我的问题)

SchemeAreaRegistration.cs:

using System.Web.Mvc;

namespace WebApplication.Areas.Scheme
{
public class SchemeAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Scheme";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Scheme_default",
            "Scheme/{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "WebApplication.Areas.Scheme.Controllers" }
        );
    }
}
}

ErrorController.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication.Areas.Scheme.Controllers
{
public class ErrorController : Controller
{
    // GET: Scheme/Error
    public ActionResult Index()
    {
        return View();
    }
}
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

试试这样。

@Html.ActionLink("your link", "Index", "Error", new { area = "Scheme" }, null)

@Url.Action("Action", "Controller", new { area = "AreaName" })

@Html.RouteLink("your link", new { action = "Index", controller = "Error", area = "Scheme" })

答案 1 :(得分:0)

你正在调用Html.ActionLink的这个重载:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper,
    string linkText, string actionName, object routeValues);

请注意,第一个参数( this 之后)是linkText,可能不是您的意图或期望。

你可能应该称之为:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper,
    string linkText, string actionName, string controllerName,
    object routeValues, object htmlAttributes);

请注意,controllerName的所有重载都需要同时存在routeValues和htmlAttributes。 所以你的电话会变成:

@Html.ActionLink("Click here", "Index", "Error", new { area="Scheme" }, null);