4

ASP.NET 5 MVC6 RC1 には、従来の「画面の左側」のメイン メニューを表すように設計された ViewComponent があります。

各メニュー項目リンクを表す最初の TagHelper を作成しています。

ハイパーリンクを作成しようとしている部分で立ち往生しています。

解決方法~/dashboard/summary?

このページのメニューを表示すると、リンクが のように表示され/dashboard/~/dashboard/summaryます。

@Url.Content("...")@Url.Content("...")ie が表示され、剃刀として処理されません。タグ ヘルパーは pure を出力します。

最終的には .net コアの展開可能なソリューションを目指しているので、理想的には、ソリューションが .NET コアと互換性があることを望みます。

下記参照:

namespace Website
{

    /// <summary>
    /// <MainMenuLink area="" controller="" action=""></MainMenuLink>
    /// 
    /// to render
    /// 
    ///  <a href="~/account/manage/ChangePassword" class="list-group-item @GetClassName("manage", "changepassword")">
    ///    <p class="list-group-item-text"><i class="fa fa-terminal"></i>&nbsp;&nbsp;Change my password</p>
    /// </a>
    /// 
    /// 
    /// </summary>
    [HtmlTargetElement(Attributes = "area, controller, action")]
    public class MainMenuLinkTagHelper : TagHelper
    {
        [HtmlAttributeName("area")]
        public string Area { get; set; }

        [HtmlAttributeName("controller")]
        public string Controller { get; set; }

        [HtmlAttributeName("action")]
        public string Action { get; set; }

        public UrlHelper urlHelper { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "a";    // Works    
            // Stuck here - I want ~/ to resolve to the base root.  
            // At the moment the address is here is localhost:XXXXX/dashboard/~/dashboard/summary

            // Would prefer to use a method which can be used with .net core and not System.Web

            output.Attributes.Add("href", "~/dashboard/summary");
            output.Content.SetHtmlContent("Click me");

        }        
        /// <summary>            
    }
}

ありがとう!ダン。

4

2 に答える 2

13

ASP Core 2.0IActionContextAccessorは既定では含まれていないように見えるIServiceCollectionため、受け入れられたソリューションを機能させるには、起動時に登録する必要があります。

services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

それ以外の場合は、 のプロパティを拡張するTagHelperに設定できる属性が提供されます。ViewContextActionContext

using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;

[HtmlTargetElement("my-tag")]
public class MyTagHelper : TagHelper {

    private readonly IUrlHelperFactory urlHelperFactory;

    [ViewContext]
    [HtmlAttributeNotBound]
    public ViewContext ViewContext { get; set; }

    public MyTagHelper (IUrlHelperFactory urlHelperFactory) {
        this.urlHelperFactory = urlHelperFactory;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output) {
        var urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
    }
}

注:ViewContextプロパティには public set メソッドが必要です

于 2018-03-20T16:13:26.790 に答える
4

IUrlHelperタグ ヘルパーにコンストラクターの依存関係を追加します。次に、ビューで使用できるのと同じ拡張メソッドを使用して、次のような URL を生成しますIUrlHelper.Action(actionName, controllerName)

private IUrlHelper urlHelper;
...
public MainMenuLinkTagHelper (IUrlHelper urlHelper)
{
    this.urlHelper = urlHelper;
}
...
public override void Process(TagHelperContext context, TagHelperOutput output)
{
    output.TagName = "a";
    output.Attributes.Add("href", this.urlHelper.Action(this.Action, this.Controller));
    output.Content.SetHtmlContent("Click me");
} 

編集: ASP コア バージョン 1.0

を直接注入することはできなくなりましたIUrlHelper。と の両方を注入してから、 を取得する必要がIActionContextAccessorありIUrlHelperFactoryますIUrlHelper。例えば:

private IUrlHelper UrlHelper => 
    this.urlHelperFactory.GetUrlHelper(this.actionAccessor.ActionContext);
于 2015-12-20T21:47:44.887 に答える