Конвертировать C # в клиентский Javascript - PullRequest
1 голос
/ 06 августа 2009

У меня есть страница Asp.Net со списком параметров, сопровождаемых флажком в элементе управления ListView. Я применил пейджинг с помощью пейджингового контроля. Однако я хочу сохранить статус флажков на разных страницах ListView. Я сделал это с помощью следующего кода

private List<int> IDs
    {
        get
        {
            if (this.ViewState["IDs"] == null)
            {
                this.ViewState["IDs"] = new List<int>();
            }
            return (List<int>)this.ViewState["IDs"];
        }
    }

protected void AddRowstoIDList()
{
    int checkAction = 0;

    foreach (ListViewDataItem lvi in lvCharOrgs.Items)
    {
        CheckBox chkSelect = (CheckBox)lvi.FindControl("chkSelect");
        if ((((chkSelect) != null)))
        {
            int ID = Convert.ToInt32(lvCharOrgs.DataKeys[lvi.DisplayIndex].Value);


            if ((chkSelect.Checked && !this.IDs.Contains(ID)))
            {
                this.IDs.Add(ID);
                checkAction += 1;
            }
            else if ((!chkSelect.Checked && this.IDs.Contains(ID)))
            {
                this.IDs.Remove(ID);
            }
        }
    }
}

protected void lvCharOrgs_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    ListViewDataItem lvi = (ListViewDataItem)e.Item;
    if ((lvi.ItemType == ListViewItemType.DataItem))
    {
        // Find the checkbox in the current row
        CheckBox chkSelect = (CheckBox)lvi.FindControl("chkSelect");
        // Make sure we're referencing the correct control
        if ((chkSelect) != null)
        {
            // If the ID exists in our list then check the checkbox
            int ID = Convert.ToInt32(lvCharOrgs.DataKeys[lvi.DisplayIndex].Value);
            chkSelect.Checked = this.IDs.Contains(ID);
        }
    }

    if (Profile.proUserType == "basic")
    {//basic account so no choice of charity
        ((CheckBox)e.Item.FindControl("chkSelect")).Checked = true;
        ((CheckBox)e.Item.FindControl("chkSelect")).Enabled = false;
    }
}

Теперь у меня есть элемент управления CustomValidator, который проверяет, чтобы было выбрано от 3 до 5 записей. Если это правда, страница действительна и обработана. Если это не так (например, менее 3 или более 5), страница недействительна, и CustomValidator выдает метку для уведомления об этом факте.

Я использую следующий код на стороне сервера для реализации этого.

protected void lvCharOrgsValidator_ServerValidate(object source, ServerValidateEventArgs args)
{// Custom validate lvCharOrgs
   //update selected rows
    AddRowstoIDList();
    //get count and verify is correct range
    int counter = this.IDs.Count;
    args.IsValid = (counter >=3 && counter <=5) ? true : false;
}

Это все работает нормально, за исключением того, что мне нужно реализовать расширитель ValidatorCallout из AJAX Control Toolkit. Однако это не работает с CustomValidators, если они не реализуют проверку clientSide. Поэтому мне нужно преобразовать метод 'lvCharOrgsValidator_ServerValidate' в функцию JavaScript на стороне клиента.

Надеюсь, это прояснит мои требования.

Ответы [ 7 ]

2 голосов
/ 06 августа 2009

Что делает следующее?

AddRowstoIDList();

Что-то вроде следующего является началом, но для получения рабочего ответа потребуется более подробная информация о вышеупомянутом методе

function validateRowCount(sender, args) {
    //update selected rows
    AddRowstoIDList(); // Does this add row indexes to an array?

    //get count and verify is correct range
    var counter = IDList.length;
    args.IsValid = (counter >=3 && counter <=5);
}

Возможно, стоит взглянуть на Script # для более долгосрочного решения, если вы планируете много конвертировать.

EDIT:

Теперь я вижу метод AddRowstoIDList(), чтобы сделать это на стороне клиента, будет немного по-другому. Во-первых, получите ссылку на элемент DOM, который отображается для lvCharOrgs. Вероятно, самый простой способ сделать это в обычном JavaScript - это поместить функцию JavaScript на страницу и использовать серверные теги для получения визуализированного ClientID.

function validateRowCount(sender, args) {
    var lvCharOrgs = document.getElementById('<%= lvCharOrgs.ClientID %>');

    var checkboxes = lvCharOrgs.getElementsByTagName('input');
    var len = checkboxes.length;
    var counter = 0;

    for(var i =0; i < len; i++) {
        if (checkboxes[i].type == "checkbox" && checkboxes[i].checked) counter++;
    }
    args.IsValid = (counter >=3 && counter <=5);
}

Должно работать примерно так - Рабочая демоверсия

добавьте / edit к URL, если вы хотите увидеть код

1 голос
/ 29 марта 2011

SharpKit преобразует C # в клиентский JavaScript.

https://sharpkit.github.io/

1 голос
/ 06 августа 2009

Вероятно, не то, что вы хотите, но есть JSC :

"Реклама в Web 2.0? Хотите создать лучшую сеть? сайты, но JavaScript слишком сложен? нет настоящая IDE? Может быть, вы должны попробовать JSC. Веб-приложение может быть построено в Visual Studio 2008 или любой другой c # совместимый IDE, а затем приложение волшебно появляется. Вы должны думать о это как умный клиент. Прекомпилируйте ваш c # для JavaScript с JSC! Как вариант вместо использования IIS и asp.net, вы могли бы уйти с помощью apache, с mysql и php. "

1 голос
/ 06 августа 2009

Если вы измените int на var, ваш код будет действительным JavaScript. (Но поскольку это зависит от других функций и объектов, вам также необходимо преобразовать их.) Также, если вы используете компилятор c # 3.5, он останется верным C # даже с var вместо int.

1 голос
/ 06 августа 2009

Взгляните на эту статью. Это относится к asp.net mvc, но также охватывает некоторые основы, и вы можете сделать что-то подобное для asp.net. В частности, вы можете найти атрибуты удаленной проверки jquery, показанные в статье, полезными для того, что вы собираетесь делать.

0 голосов
/ 06 августа 2009

Я слышал о кросс-компиляторе из c # (или это был IL?) Для JavaScript, но, к сожалению, больше не помню имя, но в поиске Google появился такой материал: http://jsc.sourceforge.net/

0 голосов
/ 06 августа 2009

Ну, вы всегда можете включить свой собственный javascript с пользовательскими валидаторами. Здесь - ссылка на статью, в которой рассказывается о добавлении JavaScript в валидатор. Вы просто должны написать свой собственный JavaScript, на самом деле.

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