Buonasera,
ho iniziato a provare Asp.Net Core 2.2 e per iniziare volevo approfondire l'utilizzo di Razor Page (dato che non le uso molto spesso) e per farlo volevo creare una gestione dei ruoli (oltre alla gestione degli utenti già presente nei progetti di default).

Per farlo mi sono basato su un progetto trovato online, sviluppato in core 1.1 pensando di riadattarlo.
Il ink è questo
https://social.technet.microsoft.com/wiki/contents/articles/36804.asp-net-core-mvc-authentication-and-role-based-authorization-with-asp-net-core-identity.aspx?Sort=MostRecent&PageIndex=1
Ho scelto questo esempio perchè mi sembra che usa Oggetti che voglio approfondire quindi mi sembrava abbastanza completo per capire bene le logiche....però sto avendo dei problemi.

Riassumo un attimo quello che ho fatto, essendo il primo progetto non vorrei aver sbagliato approccio
- Ho creato con VS 2019 (tanto ci sono tutto nuovo) Applicazione Web Asp.Net Core 2.2 con autenticazione individuale
- Scaffolding dei file per la gestione degli utenti, personalizzazione e creazione delle classi, creazione del db in SQL, inserimento primo utente etc etc .... tutto testato corretto e funzionante

- Essendo la gestione dei ruoli una cosa da far fare in un'area amministrativa ho pensato di aggiungerlo dentro l'Identity, quindi ho creato le cartelle con questo path:

Areas/Identity/pages/Amminstrazione

ho creato un menu di navigazione nuovo, le classi etc etc... già mi viene il primo dubbio, avrei fatto meglio a creare una nuova area fuori da Identity?
riesco a navigare ed aprire la prima pagina di amministrazione die ruoli, ma qui viene il primo problema

Questo il codice della razorPage:


@page
@*@model IEnumerable<ApplicationRoleListViewModel>*@
@model ProjectUser.Areas.Identity.Pages.Amministrazione.Ruoli.ApplicationRoleModel
@using ProjectUser.Areas.Identity.Pages.Amministrazione.Nav;
@using ProjectUser.Models.Generic;
@using ProjectUser.Models.Code;
@{
    ViewData["Title"] = "Index Ruoli";
    ViewData["ActivePage"] = RuoliNavPages.ApplicationRole;
}

<div class="row">
    <div class="col-xs-12 col-md-12">
        <div class="panel panel-primary">
            <div class="panel-heading panel-head">Lista Ruoli</div>

            <div class="panel-body">
                <div class="btn-group">
                    <a id="createRoleModal" asp-page-handler="AddEditApplicationRole" data-toggle="modal" data-target="#modal-action-application-role" class="btn btn-primary">
                        <i class="glyphicon glyphicon-plus"></i>  Aggiungi Ruolo
                    </a>
                </div>
                <div class="top-buffer"></div>
                <table class="table table-bordered table-striped table-condensed">
                    <thead>
                        <tr>
                            <th>Nome Ruolo</th>
                            <th>Descrizione</th>
                            <th>Utenti (N)</th>
                            <th></th>
                        </tr>
                    </thead>
                    <tbody>
                        @foreach (var item in Model.listBind)
                        {
                            <tr>
                                <td>@item.NomeRuolo</td>
                                <td>@item.Descrizione</td>
                                <td>@item.NumeroDiUtenti</td>
                                <td>
                                    <a id="addEditApplicationRoleModal" data-toggle="modal" asp-action="AddEditApplicationRole" asp-route-id="@item.Id" data-target="#modal-action-application-role"
                                       class="btn btn-info">
                                        <i class="glyphicon glyphicon-pencil"></i>  Modifica
                                    </a>
                                    @if (item.NumeroDiUtenti == 0)
                                    {
                                        <a id="deleteApplicationRoleModal" data-toggle="modal" asp-action="DeleteApplicationRole" asp-route-id="@item.Id" data-target="#modal-action-application-role" class="btn btn-danger">
                                            <i class="glyphicon glyphicon-trash"></i>  Cancella
                                        </a>
                                    }
                                </td>
                            </tr>
                        }
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>



@*@Html.PartialAsync("Generic/_Modal", new BootstrapModal
    {
        ID = "modal-action-application-role",
        AreaLabeledId = "modal-action-application-role-label",
        Size = ModalSize.Medium
    })*@

@await Html.PartialAsync("~/Views/Shared/Generic/_Modal.cshtml", new BootstrapModal
{
    ID = "modal-action-application-role",
    AreaLabeledId = "modal-action-application-role-label",
    Size = ModalSize.Medium
})

@*@await Html.PartialAsync("_AddEditApplicationRole", new ApplicationRoleViewModel
    {
        Id = ""
    })*@

@section scripts
{
    <script src="~/js/Areas/Identity/Application-role-index.js" asp-append-version="true"></script>
}



Questo invece il relativo codice:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using ProjectUser.Areas.Identity.Models;

namespace ProjectUser.Areas.Identity.Pages.Amministrazione.Ruoli
{
    public class ApplicationRoleModel : PageModel
    {
        private readonly RoleManager<ApplicationRole> _roleManager;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly SignInManager<ApplicationUser> _signInManager;

        public IList<ApplicationRoleListViewModel> listBind { get; set; }
        public string Id { get; set; }
        [Display(Name = "Nome Ruolo")]
        public string NomeRuolo { get; set; }
        public string Descrizione { get; set; }

        public ApplicationRoleModel(
            RoleManager<ApplicationRole> roleManager,
            UserManager<ApplicationUser> userManager,
            SignInManager<ApplicationUser> signInManager)
        {
            _roleManager = roleManager;
            _userManager = userManager;
            _signInManager = signInManager;
        }

        public IActionResult OnGet()
        {
            listBind = new List<ApplicationRoleListViewModel>();
           listBind = _roleManager.Roles.Select(r => new ApplicationRoleListViewModel
            {
                NomeRuolo = r.Name,
                Id = r.Id,
                Descrizione = r.Descrizione,
                NumeroDiUtenti = _userManager.GetUsersInRoleAsync(r.ToString()).Result.Count
            }).ToList();

            return Page();
        }

        public async Task<IActionResult> OnGetAddEditApplicationRoleAsync(string id)
        {
            ApplicationRoleViewModel model = new ApplicationRoleViewModel();
            if (!string.IsNullOrEmpty(id))
            {
                ApplicationRole applicationRole = await _roleManager.FindByIdAsync(id);
                if (applicationRole != null)
                {
                    model.Id = applicationRole.Id;
                    model.NomeRuolo = applicationRole.Name;
                    model.Descrizione = applicationRole.Descrizione;
                }
            }

            return Partial("_AddEditApplicationRole", model);
        }

    }
}



Adesso il problema che non riesco a risolvere è questo:
Utilizzando i tag helper
asp-page-handler="AddEditApplicationRole"

mi aspetto di chiamare l'equivalente
        public async Task<IActionResult> OnGetAddEditApplicationRoleAsync(string id)
        {
            ApplicationRoleViewModel model = new ApplicationRoleViewModel();
            if (!string.IsNullOrEmpty(id))
            {
                ApplicationRole applicationRole = await _roleManager.FindByIdAsync(id);
                if (applicationRole != null)
                {
                    model.Id = applicationRole.Id;
                    model.NomeRuolo = applicationRole.Name;
                    model.Descrizione = applicationRole.Descrizione;
                }
            }

            return Partial("_AddEditApplicationRole", model);
        }

e invece non succede niente, ne errori, nè errori in console, anche se, ispezionando l'elemento il path richiesto sembra essere corretto dato che nell'href c'è questo:
href="/Identity/Amministrazione/Ruoli/ApplicationRole?handler=AddEditApplicationRole"

e infatti se utilizzo quel path la funzione viene chiamata....

cosa potrei fare? dov'è che sbaglio?

Dopo avrei un altro problema, quando riesco a chiamare OnGetAddEditApplicationRoleAsync (navigando con quel path), sul ritorno ottengo un errore:

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'ProjectUser.Areas.Identity.Models.ApplicationRoleViewModel', but this ViewDataDictionary instance requires a model item of type 'ProjectUser.Areas.Identity.Pages.Amministrazione.Ruoli.ApplicationRoleModel'.
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.EnsureCompatible(object value)


Premettendo che sto seguendo la guida di cui vi ho messo il link, da quello che ho capito si aspetta in ritorno la Classe ApplicationRoleModel(gisutamente) ma io per passare i dati ho bisogno di ApplicationRoleViewModel..... qui mi son perso

Consigli?
11.726 messaggi dal 09 febbraio 2002
Contributi
Ciao,


e invece non succede niente, ne errori, nè errori in console, anche se, ispezionando l'elemento il path richiesto sembra essere corretto dato che nell'href c'è questo:

Sì, il percorso sembra corretto.
Dovresti avere lo stesso identico risultato sia cliccando il link e sia incollando quel path nella barra degli indirizzi del browser (come hai fatto).
Quindi stai dicendo che se clicchi il link non succede nulla? Penso che ci sia qualche javascript che inibisce il click. Infatti vedo che il link possiede l'attributo data-toggle="modal". Boostrap intercetterà il click su quel link per aprire una modale, e perciò la pagina non navigherà verso l'indirizzo indicato.
Qui c'è un esempio su come aprire altre pagine in un iframe contenuto in una modale di bootstrap.
https://codepen.io/filippoq/pen/QwogWz


Invece, a proposito dell'errore, puoi far vedere il contenuto della tua partial _AddEditApplicationRole?
Dato che gli stai passando un oggetto di tipo ApplicationRoleViewModel come model, dovresti renderla fortemente tipizzata su quel tipo. Cioè metti questo in cima alla partial:
@model ProjectUser.Areas.Identity.Models.ApplicationRoleViewModel


ciao,
Moreno

Enjoy learning and just keep making
Ciao,
immaginavo il problema della modal, ma in teoria, dato che vorrei aprire una modal e ritornarci una partial, pensavo di aver risolto con il js (che non ho postato), però ho capito il problema e credo di riuscire a risolverlo!

Per l'altro errore per adesso grazie provo
Buongiorno, ho fatto delle prove, ma ancora non riesco.

Riassumo un attimo la logica:
Al click vorrei riemprire una modal con una partial e aprirla.

So che si potrebbe fare in altri modi, ma dato che sono in fase di studio vorrei capirne bene il funzionamento, magari sto sbagliando qualche passaggio.

la Modal Vuota in pagina è inserita con questo metodo:
@await Html.PartialAsync("~/Views/Shared/Generic/_Modal.cshtml", new BootstrapModal
{
    ID = "modal-action-application-role",
    AreaLabeledId = "modal-action-application-role-label",
    Size = ModalSize.Medium
})


credo sia corretto perchè ispezionando il codice della pagina la vedo il codice corretto e al click la modal nuova si apre, ma senza appendere la partial che mi interessa dato che non fa la chiamata per recuperarla.

Sempre utilizzando il tag Helper asp-page-handler="AddEditApplicationRole" ho provato ad usare un button invece di un a, con questo codice:


<button type="button" id="createRoleModal" asp-page-handler="AddEditApplicationRole" data-toggle="modal" data-target="#modal-action-application-role" class="btn btn-primary">
                        <i class="glyphicon glyphicon-plus"></i>  Aggiungi Ruolo
                    </button>


che una volta renderizzato viene cosi:

<button type="button" id="createRoleModal" data-toggle="modal" data-target="#modal-action-application-role" class="btn btn-primary" formaction="/Identity/Amministrazione/Ruoli/ApplicationRole?handler=AddEditApplicationRole">
  <i class="glyphicon glyphicon-plus"></i>  Aggiungi Ruolo
</button>


in questo caso l'attributo "formation" è la prima volta che lo vedo e comunque non funziona....è sbagliato il tag helper o la logica?

lasciando invece l'a, che strutturalmente mi sembrava più corretto (anche se non funzionava) ho provato a vedere se trovavo dove veniva intercettato il click ma non mi sembra di aver visto altri JS, mi manca di andare a toccare il min di Bootstrap o di jquery, secondo voi a senso scrivere una funzione jquery che intercetta l'evento e fa la chiamata?? (qui ho il dubbio: in pratica poi la partial la appendo a mano con jquery??)

Cosa potrei provare di differente?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.