Как правильно поддерживать состояние в пользовательском элементе управления сервером? - PullRequest
1 голос
/ 21 октября 2008

Это работает, но правильно ли это делать ???

У меня есть собственный серверный элемент управления, на котором есть поле [input]. Я хочу имитировать текстовое поле ASP.NET, но не полностью. Когда текстовое поле отображается, у меня есть JavaScript, который позволяет пользователям выбирать значения, которые затем помещаются в это поле ввода.

У меня есть свойство открытого текста в элементе управления. В get / set я получаю / устанавливаю viewstate для элемента управления - эта часть проста, но когда элемент управления заполняется через javascript, Text get фактически не вызывается, как правильно установить это открытое свойство с помощью JavaScript (или даже если пользователь просто набирает текст в поле)?

Edit: В OnInit я гарантирую, что состояние поддерживается путем достижения значений формы.

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "")
        {
            ViewState["MyInputBoxValue"] 
               = HttpContext.Current.Request.Form["MyInputBoxValue"];
        }
    }

Затем, чтобы вернуть значение в HtmlTextWrite, я делаю это:

protected override void RenderContents(HtmlTextWriter output)
{

        // There is an input control here and i set its value property
        // like this using the Text internal defined.
        output.Write("<input value=" + Text + ">.....

}

спасибо

Ответы [ 3 ]

1 голос
/ 21 октября 2008

Я считаю, что использование IStateManager работает лучше всего.

Например:

partial class MyControl : System.Web.UI.UserControl, IStateManager
{
    [Serializable()]
    protected struct MyControlState
    {
        public bool someValue;
        public string name;
    }

    protected MyControlState state;

    public bool someValue {
        get { return state.someValue; }
        set { state.someValue = value; }
    }

    public bool IsTrackingViewState {
        get { return true; }
    }

    protected override void LoadViewState(object state)
    {
        if ((state != null) && state is MyControlState) {
            this.state = state;
        }
    }

    protected override object SaveViewState()
    {
        return state;
    }

    protected override void TrackViewState()
    {
        base.TrackViewState();
    }
}

getDefaultState () просто загрузит некоторые разумные значения по умолчанию в новую структуру состояния. состояние отслеживается в состоянии просмотра страницы, и ASP позаботится о том, чтобы вы могли его ввести / вывести.

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

0 голосов
/ 05 марта 2009

Хм. Интересно, сможем ли мы использовать существующую персистентность ASP.NET ... попробуйте унаследовать от основного элемента управления сохранением состояния после возврата (я думаю, asp: hidden). Затем просто переопределите рендер и добавьте весь джаз, который вы хотите.

Дайте мне знать, если это работает, тогда мне не нужно будет проверять:)

0 голосов
/ 21 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...