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は、実際には(警告ごとに)同期実行されています。しかし、それは問題ではありません。
を: それは、次のい呼び出す試してみてください。私はあなたの質問のコードの簡単なレビューをしたと答えは私には明らかではありません。私はAspでコーディングしています。ネットコアはRC2以来ずっと一日中出荷されていて、VS2017は出荷されて以来かなり使い心地がよく、ツーリングには欠けているものの、Asp.Net Coreは安定しています。つまり、ブレークポイントを設定して実行を観察したところでは、あなたの例は理由を無視するようです。私は、その答えが何であるかを知ることに興味があるでしょう。申し訳ありませんが、私はこれ以上の助けにはなりません。はるかに単純なViewComponentを試し、そこからビルドすることもできます。 –
@RonC yup!私は実際にコア自体ではなく、修正のためのツールを意味しました。多くの場合、起動時にVS.2017が見つかりました。つまり、AppData \ 15.2フォルダ全体を削除して、自分自身をリセットする必要があります。それは、たまたま起こる(たいていの)たびに、私が自分のツーリングの設定をすべて失うことを意味します。私は2002年からVSを使用していて、2017年のVSバージョンをまともに見たことがありませんでした。なぜHTMLが全くレンダリングされないのかわかりません。 –