46 messaggi dal 06 gennaio 2019
Buongiorno,

Sto provandoi a fare un semplice controllo dei dati provenienti da una form ma non riesco a capire dove sbaglio..

In buona sostanmza all'interno della view "Aggiungi.cshtml"
l'intestazione dcel file è:
@model GICS.Areas.Amministrazione.Models.Reparto

    @{
        ViewBag.Title = "Inserimento Reparto";
        Layout = "~/Areas/Amministrazione/Views/Shared/_Layout.cshtml";
    }


    @using (Html.BeginForm("Aggiungi", "Reparto", FormMethod.Post, new { @class = "form_reparto" }))
    {

        @Html.ValidationSummary(true);



per non riportare i vari campi, riporto solo il codice di un campo:

                         @Html.Editor("Citta")
                        <p>@Html.ValidationMessage("Citta", "", new { @class = "text-danger" })</p>


il file RepartoAnnotazioni.cs contiene:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace GICS.Areas.Amministrazione.Models
{
    [MetadataTypeAttribute(typeof(Reparto))]


    public class Reparto    {
        [Required]
        public string Citta{ get; set; }
    } 
}

men tre il file RepartoController.cs

        public partial class Reparto
        {
                        public string Citta { get; set; }
        }



Spero di essere stato chiaro. Sinceramente ho una gran confusione in testa? Graz<ie tante per l'aiuto.

Volevo usare anche ModelState.Isvalid ma sinceramente non so da dove partire
Modificato da shadow76 il 27 marzo 2019 15:33 -
11.448 messaggi dal 09 febbraio 2002
Contributi
Ciao,


mentre il file RepartoController.cs

Il codice del controller non lo vedo ma provo a rispondere lo stesso. Fai in modo che l'action del tuo controller, quella che invochi al post dei dati, riceva un oggetto Reparto come parametro. Ad esempio:

public class RepartoController : Controller 
{
   [HttpPost]
   public ActionResult Aggiungi(Reparto reparto)
   {
      if (ModelState.IsValid)
      {
         //TODO: Il modello era valido, puoi salvarlo nel database
         //Poi reindirizzi alla pagina di elenco
         return RedirectToAction(nameof(NomeDellaTuaActionDiIndice));
      }
      else
      {
         //Mostro di nuovo la view all'utente in modo che possa correggere gli errori
         return View(Reparto);
      }
   }
}


MVC dispone di una funzionalità chiamata "model binding" che è in grado di ricreare l'oggetto Reparto in base ai dati che ha trovato nel form. E l'oggetto così creato, te lo fornisce come parametro dell'action Aggiungi. A quel punto puoi usare ModelState.IsValid per assicurarti che i dati contenuti all'interno dell'oggetto Reparto siano tutti conformi alle data annotation che hai posto sulle sue proprietà (ad esempio il [Required] che hai messo sulla proprietà Città impone che non venga lasciata vuota).

Per approfondire leggi qui al paragrafo "Binding to complex type".
https://www.tutorialsteacher.com/mvc/model-binding-in-asp.net-mvc

ciao,
Moreno
Modificato da BrightSoul il 27 marzo 2019 21:53 -

Enjoy learning and just keep making
46 messaggi dal 06 gennaio 2019
Ciao Moreno,
sono appena rientrato in ufficio e ti sto girando il codice del controller

nel momento in cui tolgo il commento a if (ModelState.Isvalid) IsValid viene segnato come errore e mi viene segnalato che ModelStateDictionary non contiene una definizione per Isvalid... etc..

namespace GICS.Areas.Amministrazione.Controllers
{
    public class RepartoController : Controller
    {
        // GET: Amministrazione/Reparto
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Aggiungi()
        {
           
        
            
            return View();
        }
        public List<string> GetDati()
        {
            List<string> returnFascia = new List<string>();
            returnFascia.Add("Selezionare la Fascia...");
            returnFascia.Add("Prima");
            returnFascia.Add("Seconda");
            returnFascia.Add("Terza");
            returnFascia.Add("Terza + Rinforzo");
            return returnFascia;
        }


        [HttpPost]
        public ActionResult Aggiungi(Reparto reparto)
        {

            {
                
                //if (ModelState.Isvalid)
                {



                    using (GICSEntities dbReparto = new GICSEntities())
                    {
                        TbReparto NewReparto = dbReparto.TbReparti.Create();
                        
                        NewReparto.CipCompilatore = Session["Cip"].ToString();
                        NewReparto.NomeReparto = reparto.NomeReparto;
                        NewReparto.Strada = reparto.Strada;
                        NewReparto.Civico = reparto.Civico;
                        NewReparto.Citta = reparto.Citta;
                        NewReparto.A = reparto.Agibili;
                        NewReparto.N = reparto.NonAgibili;
                        NewReparto.Email = reparto.Email;
                       
                        
                        NewReparto.T = reparto.Agibili + reparto.NonAgibili;
                        

                        Geo_convert address = new Geo_convert();
                        var coordinate = new List<(double Lati, double Long, string nome)>();
                        coordinate = address.Converti_indirizzo(reparto.Strada, reparto.Citta);
                        foreach (var item in coordinate)
                        {
                            NewReparto.Lat = item.Lati;
                            NewReparto.Lon = item.Long;
                            NewReparto.Nome = item.nome;
                        };

                        NewReparto.Data_registrazione = DateTime.Now;
                        NewReparto.Ip_registrazione = this.Request.ServerVariables["REMOTE_ADDR"];
                        dbReparto.TbReparti.Add(NewReparto);
                        dbReparto.SaveChanges();


                    }

                }
                return View(ListaReparti);

            }
        }

        public partial class Reparto
        {
            public string NomeReparto { get; set; }
            public string Strada { get; set; }
            public string Civico { get; set; }
            public string Citta { get; set; }
            public string Fascia { get; set; }
            public string Email { get; set; }
            public int CelleAgibili { get; set; }
            public int CelleNonAgibili { get; set; }
            public DateTime Data_registrazione { get; internal set; }

        }

    }
}


In ogni caso con questo codice se provo a non compilare il form e cliccare sul pulsante submit non appare alcun messaggio di mancanza dei dati sulla form e va avanti fino al controller eseguendo il blocco di codice che registra i dati ovviamante li si blocca
Modificato da shadow76 il 28 marzo 2019 00:26 -
Modificato da shadow76 il 28 marzo 2019 00:26 -
11.448 messaggi dal 09 febbraio 2002
Contributi

nel momento in cui tolgo il commento a if (ModelState.Isvalid) IsValid viene segnato come errore e mi viene segnalato che ModelStateDictionary non contiene una definizione per Isvalid... etc..

Guarda bene, la proprietà si chiama IsValid e non Isvalid.
Il C# è case sensitive e i nomi delle classi e di tutti i loro membri pubblici seguono la convenzione di nomi PascalCase, cioè la prima lettera di ogni parola è maiuscola. Dato che "is valid" è formato da due parole, allora bisognerà scrivere "IsValid".


In ogni caso con questo codice se provo a non compilare il form e cliccare sul pulsante submit non appare alcun messaggio di mancanza dei dati sulla form e va avanti fino al controller eseguendo il blocco di codice che registra i dati ovviamante li si blocca

Devi abilitare la validazione lato client, così che l'utente si accorga degli errori che sta facendo prima ancora che il form venga inviato. Leggi qui come fare (è facile).
https://www.c-sharpcorner.com/UploadFile/3d39b4/Asp-Net-mvc-client-side-validation/

In più, la verifica che fai con ModelState.IsValid è necessario mantenerla perché così, lato server, hai un'ultima linea difensiva contro coloro che tentano di bypassare la validazione client.
La validazione client infatti devi intenderla solo come una cortesia per gli utenti che così sanno precocemente quali dati devono correggere.

ciao,
Moreno

Enjoy learning and just keep making

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.