267 messaggi dal 29 settembre 2009
Ciao a tutti!

come da titolo ho dei problemi nel fa funzionare questi validatori remoti definiti su un modello. Come premesse vi posso dire che sto utilizzando VS2019 e ho creato una applicazione ASP.NET Core (Razor Pages) con autenticazione su db locale.

Nella root di progetto ho creato la cartella Models e al suo interno ho creato una classe modello :
    public class Role
    {
        [Key]
        public string Guid { get; set; }

        [Required]
        [StringLength(45, ErrorMessage = "{0} length must be between {2} and {1}.", MinimumLength = 3)]
        [Remote(action: "CheckUniqueName", controller: "validator")]
        public string Name { get; set; }

        [StringLength(256, ErrorMessage = "Name length can't be more than 256.")]
        public string Description { get; set; }


    }


Sempre nella root ho creato una cartella Controllers e vi ho inserito un controller così come segue:
    [Route("validator/{action}")]
    public class RemoteValidatorController : Controller
    {
        private readonly WebAdminContext _context;

        public RemoteValidatorController(WebAdminContext context)
        {
            _context = context;
        }

        [AcceptVerbs("Get", "Post")]
        public IActionResult CheckUniqueName(string name)
        {
            var x = _context.GetAllRoles();
            return Json(data: true);
        }

    }


Nel file di startup ho dichiarato la route per il controller in questione

app.UseMvc(routes =>
            {
                routes.MapRoute("validator", "{controller=validator}/{action}");
            });


Avviando il progetto riesco invocare correttamente la funzione del controller utilizzando la seguente path:

https://localhost:44338/validator/CheckUniqueName?name=pippo

la funzione viene chiamata e l'iniezione del contesto funziona! Ma se provo ad aprire la pagina razor dedicata alla modifica dell'elemento Role selezionato ottengo il seguente errore a runtime:

An unhandled exception occurred while processing the request.
InvalidOperationException: No URL for remote validation could be found.
Microsoft.AspNetCore.Mvc.RemoteAttribute.GetUrl(ClientModelValidationContext context)


per completezza mostro il codice della pagina razor
@page
@model MyNamespace.Pages.Roles.EditModel
@{
    ViewData["Title"] = "Edit";
}

<h1>Edit</h1>

<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="SelectedRole.Guid" />
            <div class="form-group">
                <label asp-for="SelectedRole.Name" class="control-label"></label>
                <input asp-for="SelectedRole.Name" class="form-control" />
                <span asp-validation-for="SelectedRole.Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="SelectedRole.Description" class="control-label"></label>
                <input asp-for="SelectedRole.Description" class="form-control" />
                <span asp-validation-for="SelectedRole.Description" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="./Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ILanWebAdmin.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace MyNamespace.Pages.Roles
{
    public class EditModel : PageModel
    {

        private readonly WebAdminContext _context;

        public EditModel(WebAdminContext context)
        {
            _context = context;
        }

        [BindProperty]
        public Role SelectedRole { get; set; }

        public async Task<IActionResult> OnGetAsync(string guid)
        {
            if (guid == null)
            {
                return NotFound();
            }

            SelectedRole = _context.GetRole(guid);

            if (SelectedRole == null)
            {
                return NotFound();
            }
            return Page();
        }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.UpdateRole(SelectedRole);

            return RedirectToPage("./Index");
        }


    }
}


sto letteralmente impazzendo poiché l'eccezione mi impedisce di capire qual'è il link che il motore asp.net sta cercando di costruire erisolvere il problema di conseguenza.

Help me :D
Modificato da claudio_dg il 09 luglio 2019 12:40 -
Modificato da claudio_dg il 09 luglio 2019 12:41 -
267 messaggi dal 29 settembre 2009
Questo è il mio primo proggetto in asp.net core e provengo direttamente dalle webform. Ahimè credo che mi manchi del background di fondo su MVC che in questo momento non posso permettermi di studiare affondo. Detto questo sono riuscito a far funzionare queste Remote Validation per puro caso

il problema principale è la dichiarazione del controller che deve eseguire la validazione:

Codice sbagliato:
    public class Role
    {
        [Key]
        public string Guid { get; set; }

        [Required]
        [StringLength(45, ErrorMessage = "{0} length must be between {2} and {1}.", MinimumLength = 3)]
        [Remote(action: "CheckUniqueName", controller: "validator")]// <<- Non bisogna usare il nome usato per la route
        public string Name { get; set; }

        [StringLength(256, ErrorMessage = "Name length can't be more than 256.")]
        public string Description { get; set; }


    }


Codice corretto:
    public class Role
    {
        [Key]
        public string Guid { get; set; }

        [Required]
        [StringLength(45, ErrorMessage = "{0} length must be between {2} and {1}.", MinimumLength = 3)]
        [Remote(action: "CheckUniqueName", controller: " RemoteValidator")]// <<- Bisogna usare il nome della classe togliendo la parte finale "Controller"
        public string Name { get; set; }

        [StringLength(256, ErrorMessage = "Name length can't be more than 256.")]
        public string Description { get; set; }


    }


Sembrerebbe quindi che sotto MVC vi sia una convenzione sulla nomenclatura delle classi controller del tipo <nome_controller>Controller e utilizzare <nome_controller> per accedervi.

Qualcuno può confermare?
39 messaggi dal 20 luglio 2011
confermo ,quando infatti chiami un action di un controller tramite url devi scrivere il nome del controller senza la parola controller che fà parte invece della dichiarazione del controller

"Imparare è un'esperienza, tutto il resto è solo informazione." -Albert Einstein-

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.