2017-05-11 5 views
1

유창한 구문을 사용하여 강력한 형식의 HTML 도우미를 만들려고합니다. 나는 온라인에서 예제를 보았지만 그들은 모두 TagBuilder을 사용하여 html을 구현했다. 대신 나중에 액세스 할 수 있도록 CurrencyTextBox 클래스의 원본 HTML 도우미 개체에 대한 참조를 저장하려고합니다. 많은 유용한 정보가 포함되어 있으며 TextBoxFor 메서드를 사용하여 텍스트 상자를 만들 수도 있습니다.유창한 구문을 사용하여 강력하게 형식화 된 HtmlHelper를 만드는 방법은 무엇입니까?

아래 코드는 작동하지 않습니다.

확장 메서드

public static class CurrencyTextBoxHelper 
{ 
    public static CurrencyTextBox<TModel, TValue> CurrencyFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     return new CurrencyTextBox<TModel, TValue>(helper, expression); 
    } 
} 

CurrentTextBox 클래스 내가 오류

심각도 코드 설명 Proj를 얻을 ToString() 방법 안에 그러나 위의 코드에서

public class CurrencyTextBox<TModel, TValue>: IHtmlString 
{ 
    private RouteValueDictionary _attr = null; 
    private HtmlHelper<TModel> _helper; 
    private Expression<Func<TModel, TValue>> _expression; 

    public CurrencyTextBox(HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
    { 
     _helper = helper; 
     _expression = expression; 
     _attr = new RouteValueDictionary(); 
    } 

    public CurrencyTextBox<TModel, TValue> AddClass(string class) 
    { 
     _attr.Add("class",class); 
     return this; 
    } 

    public CurrencyTextBox<TModel, TValue> Enabled(bool enabled) 
    { 
     if (!enabled) 
     { 
      _attr.Add("disabled", "disabled"); 
     } 
     return this; 
    } 
    public string ToHtmlString() 
    { 
     return ToString(); 
    } 

    public override string ToString() 
    { 
     // i get error at line below 

     var textBox = _helper.TextBoxFor(_expression, ModelMetadata.FromLambdaExpression(_expression, _helper.ViewData).EditFormatString, _attr); 

     return textBox.Tostring(); 
    } 
} 

, ect 파일 줄 제거 상태 오류 CS1061 'HtmlHelper'에 'TextBoxFor'에 대한 정의가없고 확장 메서드가없는 'TextBoxFor' a 지시문을 사용하지 않거나 'HtmlHelper'형식의 인수 을 수락 할 수 없습니다. 어셈블리 참조?)

또한 htmlhelper와 expression을 costructor에 전달할 수 있습니까? 귀하의 overrideToString() 메도에서 ToHtmlString()

답변

0

변경 Tostring() :

예 :

public override string ToString() 
{ 

    var textBox = _helper.TextBoxFor(_expression, ModelMetadata.FromLambdaExpression(_expression, _helper.ViewData).EditFormatString, _attr); 

    return textBox.ToHtmlString(); 
} 

변경 AddClass 방법은 다음과 같은 :

public CurrencyTextBox<TModel, TValue> AddClass(string className) 
    { 
     _attr.Add("class",className); 
     return this; 
    } 

희망이 당신을 위해 도움입니다.

0

먼저 올바른 구문을 사용해야합니다.

public CurrencyTextBox<TModel, TValue> AddClass(string class) 

클래스 키워드를 예약되어 있습니다. 당신은

return textBox.Tostring(); 

C 번호는 대소 문자를 구분 클래스 명에 이름을 변경해야합니다. 그래서 return textBox.ToString();을 사용해야합니다.

0

내 일부

TextBoxFor 방법은 System.Web.Mvc.Html; 네임 스페이스에에서 어리석은 실수였다. 그래서 using System.Web.Mvc.Html;을 추가하면 수정됩니다.