2010-08-13 1 views
8

Я спросил question, чтобы узнать, почему в моем приложении выделяются текстовые поля (т.е. красная рамка и розово-заштрихованная backgroung применяются к текстовое поле), когда я использую привязку модели для проверки модели (TryUpdateModel()), но не тогда, когда я проверяю вручную (ModelState.AddModelError). Прошло уже 2 дня без ответа. Я сам пробовал все без успеха. Поэтому я решил задать вопрос по-другому.. Input-validation-error в текстовое поле, когда форма повторно отображается для отказавшего значения

Как я понимаю ИТ, вот как ModelBinding обрабатывает запрос.

  1. ModelBinding получить входящие значения от HttpContext
  2. Это экземпляр объекта этой модели
  3. пытается проанализировать эти значения объекта
  4. Если есть неправильно коснуться с собственностью, он использует ModelState.AddModelError для пометить свойства, которые с ними что-то не так.
  5. Повторные отображает вид

Вот мой вопрос Когда повторно появится форма:

Что делается для текстовых полей, значения которых не действует, чтобы получить выделены?

Я знаю, что есть несколько классов в site.css, такие как .Входных-проверке ошибки и .field-проверка ошибки, что получить применяются в текстовое поле. Возможно, ModelBinding использует внутреннюю команду, такую ​​как AddCss («# MyTextBox», «.input-validation-error»).

Если я знаю, как это работает, я могу (возможно) выполнить его вручную и решить свою проблему.

EDIT

По просьбе @Ian Galloway, вот код

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 2

Я выбрал один из зрения (так как все они испытывают тот же вопрос). Вид называется 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> 
<%} %> 

Спасибо за помощь.

+0

Вы можете разместить код вида для текстового поля и C# код, в котором вы вручную добавив ошибку модели, пожалуйста? –

+0

@Ian Galloway: Проверьте изменения выше – Richard77

+0

@Ian Galloway: Я пытаюсь опубликовать код, но формирование не очень хорошо. Поэтому я попытаюсь выбрать часть кода и написать их вручную, а не копировать/вставлять все. – Richard77

ответ

5

На самом деле это подсветка выполняется хелмерами, которые визуализируют текстовые поля. Он проверяет, есть ли ошибка в состоянии модели с данным ключом, и при необходимости добавляет необходимые классы CSS.

+0

Привет @ Дардин Димитров. Рад снова иметь тебя. если этот контроль выполняется html-помощником, почему этот помощник не обнаруживает ошибку, когда я использую ModelState.AddModelError вместо TryUpdateModel? – Richard77

+0

Если вы используете 'TryUpdateModel', есть ли ошибка, добавленная в словарь ModelState с заданным ключом? Если нет, то, вероятно, именно по этой причине хелперы HTML не подбирают его. –

+0

Да. Фактически, как TryUpdateModel, так и ModelState.AddModelError добавляют ошибки в ModelSate. И в обоих случаях Html.ValidateSummary() отображает сообщения об ошибках поверх формы. Однако Html.validateMessageFor() работает только при использовании TryUpdateModel, а не с ModelState.AddModelError(). Точно так же текстовые поля выделяются только с помощью TryUpdateModel, а не с ModelState.AddModelError(). – Richard77

4

Я подозреваю, что проблема заключается в том, что параметр «ключ», который вы передаете в ModelState.AddModelError должен соответствовать имени соответствующего элемента управления в форме.

(В противном случае, как вы ожидали бы вид двигателя, чтобы узнать, которые контролируют, чтобы сделать в состоянии ошибки?)

+0

@Ian Galloway: Я начал подозревать, что я не правильно написал ключ. Затем проверьте второе редактирование. – Richard77

+0

Hm. Можете ли вы посмотреть в своей разметке и рассказать мне, как называется имя Html.TextBoxFor (x => x.registrationData.Objective)? –

+0

Richard77

0

Подсветка делается с помощью CSS, который применяется к текстовом поле. Так что вам нужно добавить CSS ниже:

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

}