2013-07-01 10 views
6

Non capisco perché ModelState.isValid mi dia in tutti i modi. Ho impostato qualcosa nella e-mail restituisce true e ho campo vuoto, restituisce anche vero. La mia domanda è, che cosa devo fare per restituire true quando il campo è vuoto e nulla in cui ho scritto l'e-mail?MVC 4. ModelState.IsValid restituisce sempre true

Ho la successiva visualizzazione del file:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <div style="padding-top:5px;clear:both;"></div> 
    <% using (Html.BeginForm()) { %> 
     <%: Html.ValidationSummary(true) %> 
     <fieldset> 
       <legend>Email usuario</legend> 

       <div class="editor-field"> 
        <%: Html.TextBoxFor(m => m.Email) %> 
        <%: Html.ValidationMessageFor(m => m.Email) %> 
       </div> 

       <input type="submit" value="Enviar Email" /> 
     </fieldset> 
    <% } %> 
    <div style="padding-top:5px;clear:both;"></div> 
</asp:Content> 

il controllore è:

// 
// GET: /Account/EmailRequest 
public ActionResult EmailRequest() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult EmailRequest(string email) 
{ 
    if (ModelState.IsValid) 
    { 
     // save to db, for instance 
     return RedirectToAction("AnotherAction"); 
    } 
    return View(); 
} 

mia classe del modello è:

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

namespace PortalClient.Models 
{ 
    public class EmailRequest 
    { 

     [Required(ErrorMessage = "required")] 
     public string Email { get; set; } 
    } 
} 
+3

Se si modifica la firma della vostra azione post dal 'stringa email' a' EmailRequest model' e poi controlla lo stato, quale risultato vedi? –

+0

[HttpPost] pubblico ActionResult EmailRequest (EmailRequest e-mail) { se (ModelState.IsValid) {// salva nel db, per esempio ritorno RedirectToAction ("AnotherAction"); } return view(); } – Dave

+0

La funzione come mi hai suggerito Ho cambiato da stringa a EmailRequest e restituisce null – Dave

risposta

6

modificare la firma della vostra azione post dal string email a EmailRequest model e quindi controllare lo stato. per esempio.

[HttpPost] 
public ActionResult EmailRequest(EmailRequest model) 
{ 
    if (ModelState.IsValid) 
    { 
     // save to db, for instance 
     return RedirectToAction("AnotherAction"); 
    } 
    return View(); 
} 
3

hai bisogno di impegnare un modello di vista il vostro punto di vista.

Cambia il tuo modello EmailRequest a qualcosa di più descrittivo come:

public class EmailRequestViewModel 
{ 
    [Required(ErrorMessage = "Required")] 
    public string Email { get; set; } 
} 

tuo metodo di azione get sarebbe simile:

public ActionResult EmailRequest() 
{ 
    EmailRequestViewModel viewModel = new EmailRequestViewModel(); 

    return View(viewModel); 
} 

tuo metodo di azione messaggio:

public ActionResult EmailRequest(EmailRequestViewModel viewModel) 
{ 
    // Check for null view model 

    if (!ModelState.IsValid) 
    { 
      return View(viewModel); 
    } 

    // Do whatever you need to do 

    return RedirectToAction("List"); 
} 

E allora la tua opinione Chiedo scusa per il codice ASP.NET MVC 4, MVC 2 è preistorico :) Questo è solo una parte della vostra vista:

@model YourProject.ViewModels.EmailRequestViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(x => x.Email) 
    @Html.ValidationMessageFor(x => x.Email) 
} 

Spero che questo aiuta.

-1

è necessario vincolare il proprio modello con legante prima di avere la capacità di chek da Modelstat.IsValid

public ActionResult EmailRequest() 
    { 
      EmailRequest email = new EmailRequest(); 
      TryUpdateModel(email); 
     if (ModelState.IsValid) 
     { 
      // save to db, for instance 
      return RedirectToAction("AnotherAction"); 
     } 
     return View(); 
    }