2014-06-08 26 views
5

Sono nuovo in ASP.NET MVC e utilizzo della versione 5. Ho creato un modulo nel layout e non riesco a non riuscire a visualizzare errori di convalida sulla vista. Inserirà correttamente l'azione e, se il modello è valido, verrà eseguito. Se il modello non è valido, otterrò il seguente errore.ASP.NET MVC 5 Convalida modulo

Spero che qualcuno possa indicarmi la giusta direzione. Grazie in anticipo!

Server Error in '/' Application. 

The view 'ContactSubmit' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/Home/ContactSubmit.aspx 
~/Views/Home/ContactSubmit.ascx 
~/Views/Shared/ContactSubmit.aspx 
~/Views/Shared/ContactSubmit.ascx 
~/Views/Home/ContactSubmit.cshtml 
~/Views/Home/ContactSubmit.vbhtml 
~/Views/Shared/ContactSubmit.cshtml 
~/Views/Shared/ContactSubmit.vbhtml 

Questo è il mio modello che sto usando:

public partial class Lead 
{ 
    [Key] 
    public int LeadId { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=2, ErrorMessage="* A valid first name is required.")] 
    [Display(Name="First Name")] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=2, ErrorMessage="* A valid last name is required.")] 
    [Display(Name="Last Name")] 
    public string LastName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength=2, ErrorMessage="* A valid company is required.")] 
    public string Company { get; set; } 

    [Required] 
    [StringLength(50)] 
    [EmailAddress(ErrorMessage="* A valid email address is required.")] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(15, MinimumLength=9, ErrorMessage="* A valid phone nunber is required.")] 
    [Phone(ErrorMessage="Please enter a valid phone number.")] 
    public string Phone { get; set; } 
} 

Questo è il codice che ho nel mio controller casa:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult ContactSubmit(
    [Bind(Include = "FirstName, LastName, Company, Email, Phone")] 
    Lead lead) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      lead.Tenant = SessionManager.Get<Tenant>(Constants.SessionTenant); 
      lead.Refferer = SessionManager.Get<string>(Constants.SessionRefferal); 
      DataStoreManager.AddLead(lead); 
      return RedirectToAction("SubmissionConfirmed", lead); 
     } 
    } 
    catch (DataException /* dex */) 
    { 
     ModelState.AddModelError("", "Unable to perform action. Please contact us."); 
     return RedirectToAction("SubmissionFailed", lead); 
    } 

    return View(lead); 
} 

[HttpGet] 
public ActionResult ContactSubmit() 
{ 
    return View(); 
} 

Questa è la forma che ho nel mio layout :

   @using (Html.BeginForm("ContactSubmit", "Home", FormMethod.Post)) 
        { 
         @Html.AntiForgeryToken() 
         <fieldset> 
          <div class="editor-label"> 
           @Html.LabelFor(m => m.FirstName) 
          </div> 
          <div class="editor-field"> 
           @Html.EditorFor(m => m.FirstName) 
           @Html.ValidationMessageFor(m => m.FirstName) 
          </div> 

          <div class="editor-label"> 
           @Html.LabelFor(m => m.LastName) 
          </div> 
          <div class="editor-field"> 
           @Html.EditorFor(m => m.LastName) 
           @Html.ValidationMessageFor(m => m.LastName) 
          </div> 

          <div class="editor-label"> 
           @Html.LabelFor(m => m.Company) 
          </div> 
          <div class="editor-field"> 
           @Html.EditorFor(m => m.Company) 
           @Html.ValidationMessageFor(m => m.Company) 
          </div> 

          <div class="editor-label"> 
           @Html.LabelFor(m => m.Email) 
          </div> 
          <div class="editor-field"> 
           @Html.EditorFor(m => m.Email) 
           @Html.ValidationMessageFor(m => m.Email) 
          </div> 

          <div class="editor-label"> 
           @Html.LabelFor(m => m.Phone) 
          </div> 
          <div class="editor-field"> 
           @Html.EditorFor(m => m.Phone) 
           @Html.ValidationMessageFor(m => m.Phone) 
          </div> 
          <div class="masthead-button-wrapper"> 
           <input class="btn btn-warning" type="submit" value="Submit" /> 
          </div> 
         </fieldset> 
        } 
+0

Qual è il nome file del tuo 'View'? –

risposta

2

C'è un errore in il tuo codice, non l'ho notato prima. Nel metodo get che si sta utilizzando -

return View(); 

che significa che la vista non permette parametro, ma quando c'è un errore che si sta utilizzando -

return View(lead); 

In questo caso MVC è alla ricerca per la vista con lo stesso nome ma che accetta anche un parametro di tipo Lead e fallisce poiché non c'è nessuna vista con quell'opzione e l'unico che viene trovato non accetta parametri come visti dal metodo Get. Quando non v'è alcun errore, si reindirizzano a -

return RedirectToAction("SubmissionConfirmed", lead); 

e la vista con il parametro è mai avuto bisogno di essere cercato e quindi nessun errore.

Quindi, modificare la vista per accettare un parametro di Lead e modificare di conseguenza il metodo get.

Questo potrebbe essere d'aiuto. -

[HttpGet] 
public ActionResult ContactSubmit() 
{ 
    var lead = new Lead(); 
    return View(lead); 
} 

e nella vista aggiungere

@model Lead 

in cima

EDIT: Nel caso in cui dal momento che si reindirizzano si deve sapere che ModelState viene inizializzata a ogni richiesta, in modo da reindirizzare lo cancella automaticamente. Devi usare altri mezzi per passare lo stato del modello o meglio se usi la convalida del lato client.

+0

Sì, ho entrambi i set – BoredOfBinary

+0

Ho aggiunto una modifica, fammi sapere se questo aiuta –

+0

Provato e ancora non funziona. Solo per essere sicuro che sia consapevole, il modulo entra in un modello di layout, quindi se sono su indice dovrebbe tornare al modulo indice con gli errori di validazione. – BoredOfBinary