2010-08-13 16 views
8

fallido. He preguntado question para saber por qué, en mi aplicación, los cuadros de texto se están resaltando (es decir, el borde rojo y el backgroung sombreado se aplican a el cuadro de texto) cuando uso modelbinding para validar el modelo (TryUpdateModel()) pero no cuando puedo validar de forma manual (ModelState.AddModelError). Han pasado 2 días sin respuesta. He intentado todo yo mismo sin éxito. Por lo tanto, decido hacer la pregunta de manera diferente..input-validation-error a un cuadro de texto cuando se vuelve a mostrar el formulario para el valor

La forma en que la entiendo, así es como ModelBinding trata una solicitud.

  1. ModelBinding obtener valores entrantes de HttpContext
  2. Se instanciar un objeto de ese modelo
  3. intenta analizar esos valores al objeto
  4. Si hay calle detrás de malo en una propiedad, se utiliza para ModelState.AddModelError marcar las propiedades que tienen algo mal con ellos.
  5. vuelve a mostrar la vista

Aquí está mi pregunta Cuando se vuelve a mostrar la forma:

lo que se hace para los cuadros de texto cuyos valores no son válidos para ser destacado?

sé que hay algunas clases en Site.css, como .input validación de errores y .field validación de errores que obtener aplicado al cuadro de texto. Tal vez ModelBinding use internamente un comando como AddCss ("# MyTextBox", ".input-validation-error").

Si sé cómo funciona, puedo (tal vez) aplomarlo manualmente y resolver mi problema.

EDITAR

a lo solicitado por @Ian Galloway, aquí está el código

public class RegistrationController : Controller 
{ 
    public FormViewModel formViewModel; 
    private RegistrationService _registrationService = new RegistrationService(); 
    private SaveService _saveService = new SaveService(); 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var serialized = Request.Form["formViewModel"]; 
     if (serialized != null) 
     { 
      formViewModel = (FormViewModel)new MvcSerializer() 
          .Deserialize(serialized); 
      TryUpdateModel(formViewModel); 
     } 
     else 
      formViewModel = (FormViewModel)TempData["formViewModel"] 
          ?? new FormViewModel(); 
    } 
    protected override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if (filterContext.Result is RedirectToRouteResult) 
      TempData["formViewModel"] = formViewModel; 
    } 
    public ActionResult SetUpOrganization(string cancel, string nextButton) 
    { 
     if ((nextButton != null) && ModelState.IsValid) 
     { 
      if (formViewModel.navigationData.IsAReview) 
       return RedirectToAction("RequestPreview"); 
      return RedirectToAction("ChooseTypeOrganization"); 
     } 
     ViewData["Cities"] = _registrationService.Get_Cities(); 
     formViewModel.navigationData.NextAction = "SetUpOrganization"; 
     return View(formViewModel); 
    } 
    public ActionResult ChooseTypeOrganization(string backButton, string nextButton) 
    { 
     if (backButton != null) 
     { 
      return RedirectToAction("SetUpOrganization"); 
     } 
     if (nextButton != null) 
     { 
      if (formViewModel.navigationData.IsAReview) 
       return RedirectToAction("RequestPreview"); 
      return RedirectToAction("DocumentsPresented"); 
     } 
     ViewData["TypeOrganization"] = _registrationService.Get_AllTypeOrganization(); 
     formViewModel.navigationData.NextAction = "ChooseTypeOrganization"; 
     return View(formViewModel); 
    } 
    public ActionResult DocumentsPresented(string backButton, string nextButton) 
    { 
     if (backButton != null) 
     { 
      return RedirectToAction("ChooseTypeOrganization"); 
     } 
     if (nextButton != null) 
     { 
      //Validation 
      if (string.IsNullOrEmpty(formViewModel.registrationData.DocumentPresente)) 
      { 
       ModelState.AddModelError("DocumentPresente", "Veuillez préciser votre 
        autorisation"); 
       return View(formViewModel); 
      } 
      //Navigation 
      if (formViewModel.navigationData.IsAReview) 
       return RedirectToAction("RequestPreview"); 
      return RedirectToAction("PeopleRecommended"); 
     } 
     formViewModel.navigationData.NextAction = "DocumentsPresented"; 
     return View(formViewModel); 
    } 
    public ActionResult PeopleRecommended(string backButton, string nextButton, string deleteButton, 
              string deletePerson, string addPerson) 
    { 
     if (backButton != null) 
     { 
      return RedirectToAction("DocumentsPresented"); 
     } 
     if (nextButton != null) 
     { 
      ModelState.Clear(); 
      if (formViewModel.registrationData.PeopleRecommended.Count == 0) 
       ModelState.AddModelError("", "Il faut absolument designer un responsable pour la requête"); 
      // 
      if (ModelState.IsValid) 
      { 
       if (formViewModel.navigationData.IsAReview) 
        return RedirectToAction("RequestPreview"); 
       return RedirectToAction("StateObjectifs"); 
      } 
      else 
      { 
       return View(formViewModel); 
      } 
     } 
     // 
     if (addPerson != null) 
     { 
      if (ModelState.IsValid) 
      { 
       formViewModel.registrationData.PeopleRecommended.Add(
        _registrationService.Translate_PersonToBeAdded_Into_Person(formViewModel.personToBeAdded) 
        ); 
       formViewModel.personToBeAdded = null; 
      } 
      else 
      { 
       formViewModel.navigationData.NextAction = "PeopleRecommended"; 
       return View(formViewModel); 
      } 
     } 
     if (deleteButton != null) 
     { 
      formViewModel.registrationData.PeopleRecommended.RemoveAt(int.Parse(deletePerson)); 
     } 
     ViewData.ModelState.Clear(); 
     formViewModel.navigationData.NextAction = "PeopleRecommended"; 
     return View(formViewModel); 
    } 
    [ValidateInput(false)] 
    public ActionResult StateObjectifs(string backButton, string nextButton) 
    { 
     if (backButton != null) 
     { 
      return RedirectToAction("PeopleRecommended"); 
     } 
     if (nextButton != null) 
     { 
      if (string.IsNullOrEmpty(formViewModel.registrationData.Objective) || 
       string.IsNullOrEmpty(formViewModel.registrationData.RequestDetails)) 
      { 
       if (string.IsNullOrEmpty(formViewModel.registrationData.Objective)) 
        ModelState.AddModelError("Objective", "Vous devez préciser l'objectif de votre requête"); 

       if (string.IsNullOrEmpty(formViewModel.registrationData.RequestDetails)) 
        ModelState.AddModelError("RequestDetails", "Vous devez préciser le contenu de votre requête"); 
       return View(formViewModel); 
      } 

      if (formViewModel.navigationData.IsAReview) 
       return RedirectToAction("RequestPreview"); 
      return RedirectToAction("StateDeadLine"); 
     } 
     return View(formViewModel); 
    } 

    public ActionResult StateDeadLine(string backButton, string nextButton) 
    { 
     if (backButton != null) 
     { 
      return RedirectToAction("StateObjectifs"); 
     } 
     if (nextButton != null) 
     { 
      if (formViewModel.registrationData.ChooseDifferentDeadLine) 
      { 
       if (formViewModel.registrationData.DifferentDeadline == null || 
        string.IsNullOrEmpty(formViewModel.registrationData.ReasonsForDifferentDeadLine)) 
       { 
        if (formViewModel.registrationData.DifferentDeadline == null) 
         ModelState.AddModelError("DifferentDeadline", "Clickez pour choisir une nouvelle date"); 
        if (string.IsNullOrEmpty(formViewModel.registrationData.ReasonsForDifferentDeadLine)) 
         ModelState.AddModelError("ReasonsForDifferentDeadLine", "Expliquez brievement pour quoi ce changement"); 

        return View(formViewModel); 
       } 
      } 
      return RedirectToAction("RequestPreview"); 
     } 
     formViewModel.navigationData.NextAction = "StateDeadLine"; 
     return View(formViewModel); 
    } 
    public ActionResult RequestPreview(string backButton, string nextButton, string reviewInput, string save) 
    { 
     if (backButton != null) 
     { 
      return RedirectToAction("StateDeadLine"); 
     } 
     if (nextButton != null) 
     { 
      _saveService.Save_FormViewModel(formViewModel); 
      return RedirectToAction("Index", "Home"); 
     } 
     if (reviewInput != null) 
     { 
      formViewModel.navigationData.IsAReview = true; 
      return RedirectToAction(RedirectHelpers.RedirectReviewAction(formViewModel.navigationData, reviewInput)); 
     } 
     ViewData["TypeOrganization_Summary"] = _registrationService.Get_TypeOrganization_Summary(
                   formViewModel.registrationData.TypeOrganizationID                 ); 
     if (save != null) 
     { 
      _saveService.Save_FormViewModel(formViewModel); 
      return RedirectToAction("Index", "Home"); 
     } 

     formViewModel.navigationData.NextAction = "RequestPreview"; 
     return View(formViewModel); 
    } 
} 

Editar número 2

He choosed uno de la vista (ya que todos ellos la experiencia el mismo problema). La vista se llama StateObjectifs.aspx

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<!-- Script Begin --> 
<script src="../../Scripts/tiny_mce/tiny_mce.js" type="text/javascript"></script> 
<script type = "text/javascript"> 
    tinyMCE.init({ 
     mode: "textareas", 
     theme: "advanced", 

     theme_advanced_toolbar_location: "top", 
     theme_advanced_toolbar_align: "left", 
     theme_advanced_statusbar_location: "bottom", 
     theme_advanced_resizing: true 
    }); 
</script> 
<!-- End Script --> 
<fieldset id = "StateObjectifs"> 
    <legend>Etape 5:</legend> 
    <div id = "left-pane" style = "width:700px"> 
    <%using (Html.BeginForm("StateObjectifs", "Registration")) 
    { %> 
    <%: Html.ValidationSummary() %> 
    <% = Html.Serialize("formViewModel", Model) %> 
    <table> 
    <tr> 
     <th><% = Html.LabelFor(x=>x.registrationData.Objective) %></th> 
     <td><% = Html.TextBoxFor(x=>x.registrationData.Objective) %> 
      <%: Html.ValidationMessageFor(x =>x.registrationData.Objective, "*")%></td> 
    </tr> 
    <tr> 
     <th colspan = "2"><% = Html.LabelFor(x =>x.registrationData.RequestDetails) %></th> 
    </tr> 
    <tr> 
     <td colspan = "2"> 
      <% = Html.TextAreaFor(x =>x.registrationData.RequestDetails, 10, 75, null) %> 

     </td> 
    </tr> 
    </table> 
    </div> 
    <div id = "right-pane"> 
     <ul> 
      <li>Les cases pour lesquelles le titre se termine par (*) sont obligatoires</li> 
      <li>Pour mieux vous servir, veuillez décrire clairement de manière concise 
       votre requête. Par exemple: <i>Les données de l'USAID sur le secteur santé pour l'année 2009</i></li> 
     </ul> 
     </div> 
     <div class = "clear"></div> 

    <fieldset> 
      <% Html.RenderPartial("NavigationView", Model.navigationData); %> 
    </fieldset> 
</fieldset> 
<%} %> 

Gracias por ayudar.

+0

Se puede publicar el código de la vista del cuadro de texto y el código C#, donde va a añadir manualmente el modelo de error, por favor? –

+0

@Ian Galloway: verifique la edición anterior – Richard77

+0

@Ian Galloway: Intento publicar el código pero el formateo no es bueno. Por lo tanto, intentaré seleccionar parte del código y escribirlo a mano, en lugar de copiar/pegar todo. – Richard77

Respuesta

5

En realidad, este destacando es realizado por los helpers que renderizan los cuadros de texto. Comprueba si hay un error en el estado del modelo con la clave dada y agrega las clases de CSS necesarias si es necesario.

+0

Hola @Darin Dimitrov. Es bueno tenerte de nuevo. si esta función de resaltado la realiza el helper html, ¿por qué este helper no detecta el error cuando utilizo ModelState.AddModelError, en lugar de TryUpdateModel? – Richard77

+0

Si usa 'TryUpdateModel', ¿se ha agregado un error al diccionario ModelState con la clave indicada? Si no, entonces es probable que esa sea la razón por la cual los ayudantes de HTML no lo recogen. –

+0

Sí. En realidad, tanto TryUpdateModel como ModelState.AddModelError agregan errores al ModelSate. Y, en ambos casos, Html.ValidateSummary() muestra mensajes de error en la parte superior del formulario. Sin embargo, Html.validateMessageFor() solo funciona cuando uso TryUpdateModel, no con ModelState.AddModelError(). Del mismo modo, los cuadros de texto se resaltan solo con TryUpdateModel, no con ModelState.AddModelError(). – Richard77

4

Sospecho que el problema que está teniendo es que el parámetro "clave" que pasa a ModelState.AddModelError debe coincidir con el nombre del control coincidente en el formulario.

(De lo contrario, ¿cómo se puede esperar que el motor a fin de saber que controlan para rendir en un estado de error?)

+0

@ Ian Galloway: Comencé a sospechar que no escribí correctamente la clave. Verifique la segunda edición luego. – Richard77

+0

Hm. ¿Puedes echar un vistazo a tu marcado y decirme cómo aparece el nombre de Html.TextBoxFor (x => x.registrationData.Objective)? –

+0

Richard77

0

El resaltado se está haciendo por CSS que se aplica a la caja de texto. Así que hay que añadir CSS a continuación:

.input-validation-error { 
border: 1px solid #ff0000; 
background-color: #ffeeee; 

}

Cuestiones relacionadas