2010-08-13 2 views
8

Ich habe eine question gefragt, warum in meiner Anwendung Textfelder hervorgehoben werden (dh rote Grenze und pink-schattierten Backgroung gelten für das Textfeld), wenn ich Modelbinding verwende, um das Modell zu validieren (TryUpdateModel()), aber nicht, wenn ich manuell validiere (ModelState.AddModelError). Es ist jetzt 2 Tage ohne Antwort. Ich habe alles selbst ohne Erfolg ausprobiert. Also entscheide ich mich, die Frage anders zu stellen..input-validation-error in ein Textfeld, wenn das Formular für fehlgeschlagenen Wert erneut angezeigt wird

So wie ich IT verstehe, hier ist, wie ModelBinding eine Anfrage behandelt.

  1. ModelBinding erhalten eingehenden Werte von Httpcontext
  2. Es ist ein Ziel dieses Modells
  3. Tries instanziiert, um diese Werte zu dem
  4. Objekt zu analysieren Wenn some falsch mit einer Eigenschaft gibt es, verwendet es ModelState.AddModelError zu Markieren Sie Eigenschaften, bei denen etwas nicht stimmt.
  5. Re: Zeigt die Ansicht

meine Frage hier Wenn das Formular erneut angezeigt wird:

Was gilt nicht für die Textfelder, deren Werte getan wird sind hervorgehoben werden?

Ich weiß, dass es einige Klassen in Site.css, wie .input-validation-Fehler und .field-validation-Fehler, die auf das Textfeld angewendet bekommen. Vielleicht verwendet ModelBinding intern einen Befehl wie AddCss ("# MyTextBox", ".input-validation-error").

Wenn ich weiß, wie es funktioniert, kann ich es (vielleicht) manuell anwenden und mein Problem lösen.

EDIT

Wie @Ian Galloway gebeten, hier ist der Code

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); 
    } 
} 

EDIT Nummer 2

Ich habe einen der Ansicht ausgewählt (wie alle von ihnen Erfahrung das gleiche Problem). Die Ansicht wird StateObjectifs.aspx genannt

<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> 
<%} %> 

Danke für die Hilfe.

+0

Können Sie den Code anzeigen für das Textfeld schreiben und den C# -Code in dem Sie manuell die Modellfehler sind das Hinzufügen bitte? –

+0

@Ian Galloway: Überprüfen Sie die Bearbeitung über – Richard77

+0

@Ian Galloway: Ich versuche, den Code zu posten, aber die Formatierung ist nicht gut. Also werde ich versuchen, einen Teil des Codes auszuwählen und sie manuell zu schreiben, anstatt alles zu kopieren/einzufügen. – Richard77

Antwort

5

Eigentlich wird diese Hervorhebung von den HTML-Helfern durchgeführt, die die Textfelder rendern. Es prüft, ob im Modellzustand ein Fehler mit dem angegebenen Schlüssel vorliegt und fügt bei Bedarf die notwendigen CSS-Klassen hinzu.

+0

Hallo @Darin Dimitroff. Schön dich wieder zu haben. Wenn dieser Highlighting von dem HTML-Hilfsprogramm ausgeführt wird, erkennt dieser Helper den Fehler nicht, wenn ich ModelState.AddModelError anstelle von TryUpdateModel verwende? – Richard77

+0

Wenn Sie 'TryUpdateModel' verwenden, wird dem ModelState-Wörterbuch ein Fehler mit dem angegebenen Schlüssel hinzugefügt? Wenn nein, dann ist das wahrscheinlich der Grund, warum die HTML-Helfer es nicht aufnehmen. –

+0

Ja. Tatsächlich fügen sowohl TryUpdateModel als auch ModelState.AddModelError dem ModelSate Fehler hinzu. Und in beiden Fällen zeigt Html.ValidateSummary() Fehlermeldungen oberhalb des Formulars an. Html.validateMessageFor() funktioniert jedoch nur, wenn ich TryUpdateModel, nicht mit ModelState.AddModelError() verwende. Auf die gleiche Weise werden Textfelder nur mit TryUpdateModel hervorgehoben, nicht mit ModelState.AddModelError(). – Richard77

4

Ich vermute, das Problem, das Sie haben, ist, dass der "Schlüssel" -Parameter, den Sie an ModelState.AddModelError übergeben, mit dem Namen des übereinstimmenden Steuerelements im Formular übereinstimmen muss.

(Ansonsten, wie würden Sie die Ansicht-Engine zu wissen, erwarten die in einem Fehlerzustand machen kontrollieren?)

+0

@Ian Galloway: Ich habe den Verdacht, dass ich den Schlüssel nicht richtig geschrieben habe. Überprüfen Sie die zweite Bearbeitung dann. – Richard77

+0

Hm. Können Sie in Ihr Markup schauen und mir sagen, wie der Name von Html.TextBoxFor (x => x.registrationData.Objective) herauskommt? –

+0

Richard77

0

Die Hervorhebung von CSS getan wird, um die mit dem Textfeld gilt. Sie müssen also die CSS unten hinzuzufügen:

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

}

Verwandte Themen