2013-05-28 11 views
0

나는 ASP.NET 웹 사이트이 아닌 웹 응용 프로그램을 가지고 있고, 나는 그것이 자신의 명명 컨테이너의 외부 점점 할 수있어 사용자 정의 CompareValidator 구축했습니다 :ASP.NET 웹 사이트에서 사용할 수있는 사용자 지정 컨트롤을 얻는 방법?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI.WebControls; 
using System.Web.UI; 

public class GlobalCompareValidator : CompareValidator 
{ 
    new protected void CheckControlValidationProperty(string name, string propertyName) 
    { 
     Control control = this.Page.NamingContainer.FindControl(name); 
     if (control == null) 
     { 
      throw new HttpException("Validator_control_not_found"); 
     } 
     if (BaseValidator.GetValidationProperty(control) == null) 
     { 
      throw new HttpException("Validator_bad_control_type"); 
     } 
    } 
} 

을 그 코드는 App_Code 디렉토리에 존재 . 지금, 나는이 같은 ASCX 페이지에 새로운 사용자 지정 컨트롤을 사용하려면 : 어셈블리를 등록 할 때

<me:GlobalCompareValidator ID="compareValidator" CssClass="errorMessage" Display="None" 
    EnableClientScript="false" Text="&nbsp;" ValidationGroup="LHError" runat="server" /> 

을하지만,이 기능을 사용하려면

<%@ Register TagPrefix="me" Namespace="MyNamespace" Assembly="MyAssembly" %> 

나는이 오류가 발생합니다 :

Could not load file or assembly '...' or one of its dependencies. The system cannot find the file specified.

지금은입니다. ASP.NET 웹 사이트가 실제로 이와 같은 어셈블리를 생성하지 않기 때문에 전혀 놀라운 것이 아닙니다. 그러나 Assembly 태그를 끈 상태로두면 GlobalCompareValidator을 찾을 수 없습니다. 물론 Assembly 태그 중 하나를 사용하여 찾을 수는 없지만 해당 오류는 어셈블리를 찾을 수 없다는 사실 때문에 숨겨져있을 가능성이 큽니다.

전 세계에서 ASP.NET 웹 사이트에서 사용할 수있는 사용자 지정 컨트롤을 어떻게 구할 수 있습니까? 당신은 UserControl을 포함하는 경우 SRC-속성에만 필요합니다 사용자 정의 컨트롤

포함 UserControl이

  • 포함

    1. :

  • 답변

    1

    좋아,이 문제에 대한 해결책이 복잡하지만, 여기 간다 :

    당신은 자세한 내용은이 MSDN 페이지를 확인할 수 있습니다. 첫째, 커스텀 컨트롤을 작동시키려는 데 상당한 시간을 소비 한 후에 문제를 생각하는 방식을 변경하기로 결정했습니다. 나는 말했다 :

    What if I could get the control in the right naming container instead?

    충분히 똑바로 보인다! 런타임에 사용자 정의 컨트롤에서 컨트롤을 제거하고이를 사용자 정의 컨트롤의 부모에 추가합니다. 그러나 그것은 그것이 보이는 것보다 훨씬 복잡합니다. Controls 컬렉션을 Init 또는 Load으로 변경하여 아이디어에 다소 문제가 있습니다. 그러나 슬프게도 Stack Overflow가 구출 된 by way of the answer here! 그래서, 무장 나는 사용자 정의 컨트롤에 다음 코드를 추가 :

    protected void Page_Init(object sender, EventArgs e) 
    { 
        this.Page.Init += PageInit; 
    } 
    
    protected void PageInit(object sender, EventArgs e) 
    { 
        if (!string.IsNullOrEmpty(this.ControlToCompare)) 
        { 
         this.Controls.Remove(this.compareValidator); 
         this.Parent.Controls.Add(this.compareValidator); 
        } 
    } 
    

    는 당신이 여기에있는 것은 페이지 수명주기에 약간의 허점이다. Controls 컬렉션을 Init 또는 Load으로 수정할 수는 없지만 두 이벤트 사이에서 수정할 수 있습니다. Tim에게 감사드립니다!

    이렇게하면 CompareValidator을 런타임에 적절한 이름 지정 컨테이너로 옮길 수 있으므로 유효성 검사를받는 사용자 정의 컨트롤을 찾을 수 있습니다.

    참고 : 또한 값을 비교할 사용자 정의 컨트롤에 ValidationProperty 특성을 추가해야합니다. 나는 이런 식으로했다 :

    [ValidationProperty("Value")] 
    

    와 다음의 과정이 사용자 제어에 노출 된 것 Value라는 이름의 속성이 있습니다. 내 경우에는 동일한 사용자 정의 컨트롤에서 두 값을 비교했기 때문에 동일한 사용자 컨트롤을 사용했습니다. CompareValidator에 대해 수정했습니다.

    이 정보가 도움이 되었기를 바랍니다.

    관련 문제