//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web.UI.WebControls { using System.ComponentModel; using System.Linq; using System.Web; using System.Web.ModelBinding; /// /// Displays the first model error for a given key from the page's model state /// [ ToolboxData("<{0}:ModelErrorMessage runat=\"server\" Key=\"ModelStateKey\">"), DefaultProperty("Key"), ParseChildren(true), PersistChildren(false) ] public class ModelErrorMessage : Label { [ Themeable(false), WebCategory("Behavior"), WebSysDescription(SR.ModelErrorMessage_ModelStateKey), DefaultValue("") ] public string ModelStateKey { get { object o = ViewState["ModelStateKey"]; return ((o == null) ? String.Empty : (string)o); } set { ViewState["ModelStateKey"] = value; } } [ DefaultValue(""), IDReferenceProperty, WebCategory("Behavior"), WebSysDescription(SR.ModelErrorMessage_AssociatedControlID), Themeable(false) ] public override string AssociatedControlID { get { return base.AssociatedControlID; } set { base.AssociatedControlID = value; } } [ WebCategory("Behavior"), Themeable(false), DefaultValue(false), WebSysDescription(SR.ModelErrorMessage_SetFocusOnError) ] public bool SetFocusOnError { get { object o = ViewState["SetFocusOnError"]; return ((o == null) ? false : (bool)o); } set { ViewState["SetFocusOnError"] = value; } } [ Browsable(false), EditorBrowsable(EditorBrowsableState.Never), PersistenceMode(PersistenceMode.Attribute) ] public override string Text { // We don't want the Text property exposed to the developer as we're going to set it // ourselves to the value from the model state. We don't want to store it in ViewState // because we want it re-evaluated on every render anyway, so storing in ViewState is // just overhead. get; set; } protected internal override void OnPreRender(EventArgs e) { base.OnPreRender(e); ModelState modelState; if (Page != null && Page.ModelState.TryGetValue(ModelStateKey, out modelState)) { ModelError error = modelState.Errors.FirstOrDefault(modelError => !String.IsNullOrEmpty(modelError.ErrorMessage)); if (error != null) { Text = HttpUtility.HtmlEncode(error.ErrorMessage); // Render the script to set focus if there is a model error for the specified key if (SetFocusOnError) { var validateId = AssociatedControlID; if (!String.IsNullOrEmpty(validateId)) { var control = FindControl(validateId); if (control != null) { validateId = control.ClientID; } Page.SetValidatorInvalidControlFocus(validateId); } } } } } } }