0

クラスに拡張メソッドを追加してHtmlHelper、開発者が毎回AreaActionLink<T>を追加したり、 . 名前空間を指定するか、エリア コントローラーの名前空間を Web.config に配置すると、これはすべてうまく機能します。new { area = "MyArea" }Controller

たとえば、Area コントローラーの名前空間を404 をスローするMy.Web.Controllers代わりに変更My.Web.MyArea.Controllersすると、名前空間を使用すると適切に解決されます。

public static MvcHtmlString AreaActionLink<T>(this HtmlHelper helper, string linkText, string actionName, object routeValues, object htmlAttributes) where T : IController
{
    RouteValueDictionary routes = new RouteValueDictionary(routeValues);
    string area = typeof(T).GetArea();
    if (!routes.ContainsKey("area"))
        routes.Add("area", area);

    return helper.ActionLink(linkText, 
        actionName, 
        typeof(T).Name.Replace("Controller", string.Empty), 
        routes, 
        htmlAttributes as Dictionary<string, object>);
}

これは、AreaActionLink を呼び出すときに名前空間が完全修飾されている場合に機能します。

namespace My.Web.Areas.MyArea.Controllers
{
    [Area("MyArea")]
    public class OtherPlaceController : Controller
    {
        //...
    }
}

そして次のように呼び出されます:

<%=Html.AreaActionLink<OtherPlaceController>("Link Text", "MyAction")%>

しかし、名前空間階層をフラット化しようとすると、新しい名前空間を追加する必要がなくなり、Area は 404 をスローします。

namespace My.Web.Controllers
{
    [Area("MyArea")]
    public class OtherPlaceController : Controller
    {
        //...
    }
}

名前空間の部分が重要なようですが、.Areas理由がわかりません...

4

1 に答える 1

1

慣れていると思いますが、デフォルトでは、ASP.NET MVCはディレクトリ構造に大きく依存しています(コントローラーは「Controllers」フォルダーにある必要があり、ビューは「Views」にある必要があります)。同じ。あなたのエリアは別々のフォルダにあるべきです-それは実際にそれらを持っている主な理由の1つです!:)

于 2010-10-22T00:42:57.973 に答える