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.
- ModelBinding obtener valores entrantes de HttpContext
- Se instanciar un objeto de ese modelo
- intenta analizar esos valores al objeto
- Si hay calle detrás de malo en una propiedad, se utiliza para ModelState.AddModelError marcar las propiedades que tienen algo mal con ellos.
- 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.
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? –
@Ian Galloway: verifique la edición anterior – Richard77
@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