1

VS.2017で開発されたASP.NET Core 1.1 Webアプリケーションがあり、ビューコンポーネントの一部をビューコンポーネントに配置することにしました。asp.netコアビューコンポーネントが実行されましたが、マークアップがレンダリングされません

このビューコンポーネントは、ユーザーIDに関連付けられた権限のディクショナリコレクションを取得し、niceテーブルに表示します。私はページの一部(VCではない)としてそれを置くときに動作します。しかし、ビューコンポーネントとして使用すると、コンポーネントのHTMLは決してレンダリングされません。

ビューコンポーネントにブレークポイントを設定し、トリガーすると、View(granted)のreturn文は、実行が期待どおりになるまで、ポピュレートされたリストを返します。

次に、ViewComponentのdefault.cshtmlコードセクションの最上部のブレークポイントを@(ここにいくつかのコード)とし、そのブレークポイントもトリガーして、ビューコンポーネントのDefault.cshtmlファイルが見つかるようにしました。このDefault.cshtmlには、テーブル内にテーブルをレンダリングするためのマークアップがいくつかあります。テーブル内に@foreach()ステートメントがあります。その正確な位置に "Run to cursor"を実行すると、反復するループもトリガーされます。コレクションを繰り返す

しかし、メインビューはビューコンポーネントが存在しないように見えますが、見つかって実行されても、Default.cshtmlで見つかったHTMLはレンダリングされません。私はここで何が欠けていますか?これまでのところ、私の印象はVS.2017(すべてのアップデートあり)はあまり安定していないということでした。

Default.cshtml

@using ACME.AspNetCore.Permissions.Infrastructure.Authorization 
@model Dictionary<Permission, string> 
@{ 
    ViewBag.UserName = "xxx"; 
    Model.Add(Permission.Permission1, "test"); 
} 

<h1>Component Output</h1> 
<div class="well well-lg"> 
<table class="table table-hover"> 
    <thead> 
     <tr> 
      <th>Permission</th> 
      <th>Description</th> 
      <th class="text-center">Status</th> 
      <th class="text-center">Revoke it!</th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var dictentry in Model) 
     { 
      <tr> 
       <td>@dictentry.Key.ToString()</td> 
       <td>@dictentry.Value</td> 
       <td class="text-center"><span class="glyphicon glyphicon-ok" style="color:green;"></span></td> 
       <td class="text-center"><a asp-action="RevokePermission" asp-route-id="@ViewBag.UserName" asp-route-pid="@dictentry.Key.ToString()"><span class="glyphicon glyphicon-thumbs-down" style="color:red;"></span></a></td> 
      </tr> 
     } 
    </tbody> 
    <tfoot><p class="alert alert-success"><span class="glyphicon glyphicon-eye-open"></span> Granted permissions</p></tfoot> 
</table> 
</div> 

GrantedPermissionsViewComponent.cs

[ViewComponent(Name = "GrantedPermissions")] 
public class GrantedPermissionsViewComponent : ViewComponent { 
    private readonly ApplicationDbContext _context; 
    public GrantedPermissionsViewComponent(ApplicationDbContext context) : base() 
    { 
     _context = context; 
    } 

    public async Task<IViewComponentResult> InvokeAsync(string emailOrUserId) 
    { 
     string id; 
     Guid UID; 
     if (Guid.TryParse(emailOrUserId, out UID)) 
     { // THE PARAMETER WAS A GUID, THUS A USER ID FROM IDENTITY DATABASE 
      id = emailOrUserId; 
     } 
     else 
     { // THE PARAMETER IS ASSUMED TO BE AN EMAIL/USERNAME FROM WHICH WE CAN DERIVE THE USER ID 
      id = _context.Users.Where(u => u.Email == emailOrUserId.Trim()).Select(s => s.Id).FirstOrDefault(); 
     } 

     Dictionary<Permission, string> granted = GetOwnerPermissions(id); 
     return View(granted);    
    } 

    private Dictionary<Permission, string> GetOwnerPermissions(string userId) 
    { 
     Dictionary<Permission, string> granted; 
     granted = _context.UserPermissions.Where(u => u.ApplicationUserId == userId) 
               .Select(t => new { t.Permission }) 
               .AsEnumerable() // to clients memory 
               .Select(o => new KeyValuePair<Permission, string>(o.Permission, o.Permission.Description())) 
               .ToList() 
               .ToDictionary(x => x.Key, x => x.Value); 

     return granted; 
    } 
} 

はなぜ地球上、それは、コンポーネントのコードをトリガならびにコンポーネントのビュー(default.cshtml)に、まだそれさそこに見つかったHTMLコードをレンダリングしませんか?

メインビューでコンポーネントのinvokation:私は何にも待つGetOwnerPermissionsを持ってする方法を見つけることができなかったので

@{await Component.InvokeAsync<GrantedPermissionsViewComponent>(
    new { emailOrUserId = ViewBag.UserName }); 
} 

NOTE

  • InvokeAsyncは、実際には(警告ごとに)同期実行されています。しかし、それは問題ではありません。
+0

を: それは、次のい呼び出す試してみてください。私はあなたの質問のコードの簡単なレビューをしたと答えは私には明らかではありません。私はAspでコーディングしています。ネットコアはRC2以来ずっと一日中出荷されていて、VS2017は出荷されて以来かなり使い心地がよく、ツーリングには欠けているものの、Asp.Net Coreは安定しています。つまり、ブレークポイントを設定して実行を観察したところでは、あなたの例は理由を無視するようです。私は、その答えが何であるかを知ることに興味があるでしょう。申し訳ありませんが、私はこれ以上の助けにはなりません。はるかに単純なViewComponentを試し、そこからビルドすることもできます。 –

+0

@RonC yup!私は実際にコア自体ではなく、修正のためのツールを意味しました。多くの場合、起動時にVS.2017が見つかりました。つまり、AppData \ 15.2フォルダ全体を削除して、自分自身をリセットする必要があります。それは、たまたま起こる(たいていの)たびに、私が自分のツーリングの設定をすべて失うことを意味します。私は2002年からVSを使用していて、2017年のVSバージョンをまともに見たことがありませんでした。なぜHTMLが全くレンダリングされないのかわかりません。 –

答えて

2

問題はViewComponentの呼び出し方法にあります。

@{ ... }を使用すると、コードを実行して出力にレンダリングしないことを意味します。

大カッコではなくカッコを使用すると、結果が出力されます。 @(...)

あなたの場合、かっこは必要ありません。本当に厄介です

@await Component.InvokeAsync("GrantedPermissions", new { emailOrUserId = ViewBag.UserName }) 

詳細情報here

+0

角かっこやかっこなしで使用すると「メソッドグループを待つことができません」というエラーが表示されます。それは括弧でなければなりません。今すぐレンダリングされました。感謝万円! –

関連する問題