PDA

Visualizza la versione completa : [MVC] Form che sembra autoinviarsi


fermat
19-02-2020, 12:28
ciao!

ho una pagina con un form di questo tipo:


@model NuovoPianoLavoroModel

<div class="container div_page_cont div_page_cont_nuovo">
<div class="card">
<div class="card-body">
@Html.ValidationSummary()

@using (Html.BeginForm("PianoLavoro", "Nuovo", FormMethod.Post, new { id = "nuovo_mug_form" }))
{
@Html.AntiForgeryToken()

............
}
</div>
</div>
</div>

@section scripts {
@Scripts.Render("~/js/validation")
}


il model richiamato questo:


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

namespaceModels.PianoLavoro
{
public class NuovoPianoLavoroModel
{

public IEnumerable<SelectListItem> TipologiaPianoLavoro { get; set; }

[Display(Name = "Descrizione")]
public string Descrizione { get; set; }

[Display(Name = "Presidio")]
public string Presidio { get; set; }

[Display(Name = "Tipologia")]
[Range(1, long.MaxValue, ErrorMessage = "Il campo {0} obbligatorio.")]
public long Tipologia { get; set; }
}

public class PianoLavoroTipo
{
[Display(Name = "Id")]
public long Id { get; set; }

[Display(Name = "Tipologia")]
public string Tipologia { get; set; }
}
}


e questo il controller:


using Easymatica.Somministrazione.Web.UI.Models.PianoLav oro;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace Controllers
{
public class PianoLavoroController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult Nuovo(NuovoPianoLavoroModel model)
{
if (model == null)
{
model = new NuovoPianoLavoroModel();
}

List<PianoLavoroTipo> list = new List<PianoLavoroTipo>
{
new PianoLavoroTipo
{
Id = 1,
Tipologia = "Tipologia 1"
},
new PianoLavoroTipo
{
Id = 2,
Tipologia = "Tipologia 2"
}
};

model.TipologiaPianoLavoro = list.Select(x =>
new SelectListItem()
{
Value = x.Id.ToString(),
Text = x.Tipologia
}
);

return View(model);
}
}
}


quando accedo alla pagina mi compaiono gli errori che i campi sono obbligatori, ma senza inviare il form.
che se si autoinviasse.
avete un'idea del perch??

djciko
20-02-2020, 10:14
a naso dipende da qualcosa di esterno..

fermat
21-02-2020, 15:49
a naso dipende da qualcosa di esterno..

tipo??

non ho proprio la minima idea.

djciko
24-02-2020, 18:19
Forse ho capito:



[Display(Name = "Tipologia")]
[Range(1, long.MaxValue, ErrorMessage = "Il campo {0} obbligatorio.")]
public long Tipologia { get; set; }



probabilmente null il campo Tipologia ed il range scatta da solo: prova a mettere da 0 a long.MaxValue

fermat
26-03-2020, 09:35
Forse ho capito:



[Display(Name = "Tipologia")]
[Range(1, long.MaxValue, ErrorMessage = "Il campo {0} obbligatorio.")]
public long Tipologia { get; set; }



probabilmente null il campo Tipologia ed il range scatta da solo: prova a mettere da 0 a long.MaxValue

ciao!

alla fine ho provato come dicevi, ma nulla.
tra l'altro me lo fa anche in un'altra pagina con questo model:



using Web.UI.Models.Contratti;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using X.PagedList;

namespace Web.UI.Models.Fornitori
{
public class FornitoriNuovoModel
{
[Display(Name = "Filtro")]
public string SearchFilter { get; set; }

public IPagedList<string> SearchResult { get; set; }

[Display(Name = "Dettaglio")]
public long Id { get; set; }

[Required]
[Display(Name = "Ragione Sociale")]
public string RagioneSociale { get; set; }

[Required]
[Display(Name = "Indirizzo")]
public string Indirizzo { get; set; }

[Required]
[Display(Name = "Partita IVA / Codice Fiscale")]
public string PivaCf { get; set; }

[Required]
[Display(Name = "Cap")]
public string Cap { get; set; }

[Required]
[Display(Name = "Citt")]
public string Citta { get; set; }

[Required]
[Display(Name = "Email aziendale")]
public string EmailAziendale { get; set; }

[Required]
[Display(Name = "Iban Dedicato")]
public string IbanDedicato { get; set; }

[Required]
[Display(Name = "Matricola Inps")]
public string MatricolaInps { get; set; }

[Required]
[Display(Name = "Matricola Inail")]
public string MatricolaInail { get; set; }

[Required]
[Display(Name = "Nome")]
public string NomeRefAzienda { get; set; }

[Required]
[Display(Name = "Cognome")]
public string CognomeRefAzienda { get; set; }

[Required]
[Display(Name = "Telefono")]
public string TelefonoRefAzienda { get; set; }

[Required]
[Display(Name = "Email di contatto")]
public string EmailContatto { get; set; }

[Required]
[Display(Name = "Pec")]
public string Pec { get; set; }

public IEnumerable<ContrattiResult> ListContratti { get; set; }

public bool contrattoVisibile { get; set; }
}
}


e le pagine dove ci sono form sono tutte uguali.
nel senso che per crearne una nuova parto da una gi fatta.
su alcune ho questo problema, su altre no.

fermat
26-03-2020, 10:49
vi faccio un altro esempio completo.
questo il model:


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

namespace Easymatica.Somministrazione.Web.UI.Models.PianoLav oro
{
public class NuovoPianoLavoroModel
{

public IEnumerable<SelectListItem> TipologiaPianoLavoro { get; set; }

[Required]
[Display(Name = "Descrizione")]
public string Descrizione { get; set; }

[Required]
[Display(Name = "Presidio")]
public string Presidio { get; set; }

[Required]
[Display(Name = "Data Inizio")]
public string DataInizio { get; set; }

[Required]
[Display(Name = "Data Fine")]
public string DataFine { get; set; }

[Required]
[Display(Name = "Ora Inizio")]
public string OraInizio { get; set; }

[Required]
[Display(Name = "Ora Fine")]
public string OraFine { get; set; }

[Display(Name = "Tipologia")]
[Range(1, long.MaxValue, ErrorMessage = "Il campo {0} obbligatorio.")]
public long Tipologia { get; set; }
}

public class PianoLavoroTipo
{
[Display(Name = "Id")]
public long Id { get; set; }

[Display(Name = "Tipologia")]
public string Tipologia { get; set; }
}
}


questo il controller:


using Easymatica.Somministrazione.Web.UI.Models.PianoLav oro;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace Easymatica.Somministrazione.Web.UI.Controllers
{
public class PianoLavoroController : Controller
{
public ActionResult Index()
{
return View();
}

public ActionResult Nuovo(NuovoPianoLavoroModel model)
{
if (model == null)
{
model = new NuovoPianoLavoroModel();
}

List<PianoLavoroTipo> list = new List<PianoLavoroTipo>
{
new PianoLavoroTipo
{
Id = 1,
Tipologia = "Tipologia 1"
},
new PianoLavoroTipo
{
Id = 2,
Tipologia = "Tipologia 2"
}
};

model.TipologiaPianoLavoro = list.Select(x =>
new SelectListItem()
{
Value = x.Id.ToString(),
Text = x.Tipologia
}
);

return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult NuovoPianoLavoro(NuovoPianoLavoroModel viewModel, string returnUrl = "")
{
if (!ModelState.IsValid)
{
return View(viewModel);
}

if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
return Redirect(returnUrl);

return RedirectToAction("Index", "PianoLavoro");
}
}
}


rispetto ad altri esempi, ho aggiunto anche l'action per recuperare i dati in post.

questa la view:


@model NuovoPianoLavoroModel

@{
ViewBag.Title = "Nuovo Piano lavoro";
}

@section styles {
@Styles.Render("~/css/validation")
}

<div class="container div_page_cont div_page_cont_nuovo">
<div class="card">
<div class="card-header">
<span class="pt-2">
<b>PIANO LAVORO</b>
</span>
</div>
<div class="card-body">
@Html.ValidationSummary()

@using (Html.BeginForm("NuovoPianoLavoro", "PianoLavoro", FormMethod.Post, new { id = "nuovo_mug_form" }))
{
@Html.AntiForgeryToken()

<div class="row">
<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.Descrizione)
@Html.TextBoxFor(m => m.Descrizione, new { @class = "form-control", @placeholder = "Es. Spostato su", autofocus = "autofocus" })
@Html.ValidationMessageFor(m => m.Descrizione)
</div>
</div>

<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.Tipologia)
@Html.DropDownListFor(m => m.Tipologia, Model.TipologiaPianoLavoro, "Seleziona una tipologia", new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Tipologia)
</div>
</div>
</div>

<div class="row">
<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.Presidio)
@Html.TextBoxFor(m => m.Presidio, new { @class = "form-control", @placeholder = "Es. 12345698781" })
@Html.ValidationMessageFor(m => m.Presidio)
</div>
</div>

<div class="col-md-6"></div>
</div>

<div class="row">
<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.DataInizio)
<div class="input-group date" id="DataInizio" data-target-input="nearest">
@Html.TextBoxFor(m => m.DataInizio, new { @class = "form-control datetimepicker-input input_date", data_target = "#DataInizio" })
<div class="input-group-append" data-target="#DataInizio" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>

<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.DataFine)
<div class="input-group date" id="DataFine" data-target-input="nearest">
@Html.TextBoxFor(m => m.DataFine, new { @class = "form-control datetimepicker-input input_date", data_target = "#DataFine" })
<div class="input-group-append" data-target="#DataFine" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>

<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.OraInizio)
<div class="input-group date" id="OraInizio" data-target-input="nearest">
@Html.TextBoxFor(m => m.OraInizio, new { @class = "form-control datetimepicker-input input_date", data_target = "#OraInizio" })
<div class="input-group-append" data-target="#OraInizio" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>

<div class="col-md-6">
<div class="form-group">
@Html.LabelFor(m => m.OraFine)
<div class="input-group date" id="OraInizio" data-target-input="nearest">
@Html.TextBoxFor(m => m.OraFine, new { @class = "form-control datetimepicker-input input_date", data_target = "#OraFine" })
<div class="input-group-append" data-target="#OraFine" data-toggle="datetimepicker">
<div class="input-group-text"><i class="fa fa-calendar"></i></div>
</div>
</div>
</div>
</div>

</div>
}
</div>
</div>
</div>

<script type="text/javascript">
$(function () {
$('#DataInizio').datetimepicker({
format: 'L',
locale: 'it'
});

$('#DataFine').datetimepicker({
format: 'L',
locale: 'it'
});

$('#OraInizio').datetimepicker({
format: 'LT',
locale: 'it'
});

$('#OraFine').datetimepicker({
format: 'LT',
locale: 'it'
});
});
</script>

@section scripts {
@Scripts.Render("~/js/validation")
}


secondo me il problema potrebbe essere qualcosa legato al controller e al form!

Loading