Генерация идентификатора для HTML-элементов в ASP.NET MVC

Мне нужно создать уникальные идентификаторы для html-элементов в приложении asp.net mvc. В классическом asp.net я мог бы использовать

<a id=<%=ClientID>%>

Есть ли какой-нибудь аналог в мире asp.net mvc?

UPDATE:

Например, я хочу создать многократно используемый элемент Button. Я бы передал код, похожий на

<div class="myButton" id="<%=ClientID%>">
<script>
  var button = document.getElementById(<%=ClientID%>);
  button.onclick = ....
</script>

Если ClientId недоступен, тогда как лучше всего следовать? На данный момент я вижу два варианта: генерировать его как Guid.NewGuid() или передавать идентификатор извне? Любые другие варианты?

UPDATE: На данный момент я пришел к следующему решению

    public static string UniqueId(this HtmlHelper html)
    {
        var idGenerator = html.ViewContext.HttpContext.Items[typeof (UniqueIdGenerator)] as UniqueIdGenerator;
        if (idGenerator==null)
            html.ViewContext.HttpContext.Items[typeof (UniqueIdGenerator)] = idGenerator = new UniqueIdGenerator();
        return idGenerator.Next();
    }
       ...
    private class UniqueIdGenerator
    {
        private int id;

        public string Next()
        {
            id++;
            return "_c" + id; // todo: optimize
        }
    }

Ответ 1

Простейшее правильное решение с использованием встроенных библиотек .NET без необходимости использования нового настраиваемого кода приложения

Используйте Guid.NewGuid(), с ToString() числовое представление "N", чтобы предотвратить недопустимые символы, которые могли бы использовать браузер JS вопросы.

Guid.NewGuid().ToString("N");

Указание MSDN в отношении спецификатора формата "N":

32 digits: 00000000000000000000000000000000

Не используйте представление GUID по умолчанию, поскольку дефисы могут быть проблематичными для работы в JS/jQuery.

Для полноты лучше всего добавить письмо к началу GUID. Хотя я никогда не испытывал проблем с этим в современных браузерах, технически, HTML id должен начинаться с буквы, а не числа.

Ответ 2

Нет единого решения.

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

Например, если вы перебираете строки из базы данных, вы можете использовать первичные ключи для генерации идентификаторов.

В качестве альтернативы вы можете вообще отказаться от идентификаторов и использовать не-уникальные классы. (это особенно удобно с селекторами jQuery и потомков)

Ответ 3

Мне понравился ответ, который вы предоставили в своем обновлении, лучше, чем с помощью Guid, потому что последний будет отличаться каждый раз, что делает отладку на стороне клиента и поиск элемента в View Source более сложным.

Я сделал еще один шаг и добавил пользовательский prefix. каждый prefix использует свой собственный счетчик, чтобы еще больше помочь в этом отношении.

    public static string GetUniqueHtmlid(this HtmlHelper html, string prefix)
    {
        var generator = html.ViewContext.HttpContext.Items[typeof (UniqueHtmlIdGenerator)] as UniqueHtmlIdGenerator;

        if(generator == null)
            html.ViewContext.HttpContext.Items[typeof(UniqueHtmlIdGenerator)] = generator = new UniqueHtmlIdGenerator();

        return generator.GetNextUniqueId(prefix);
    }

    private class UniqueHtmlIdGenerator
    {
        private readonly Dictionary<string, int> _items = new Dictionary<string, int>();

        public string GetNextUniqueId(string prefix)
        {
            if (string.IsNullOrEmpty(prefix))
                prefix = "item";

            int current;

            lock (typeof (UniqueHtmlIdGenerator))
            {
                current = _items.ContainsKey(prefix) ? _items[prefix] : 1;

                _items[prefix] = current + 1;
            }

            return string.Format("{0}-{1}", prefix, current);
        }
    }

Ответ 4

Возможно, этот код кода поможет вам:

static class MyIdGenerator
{
    public static int NextID()
    {
        static int _id = 0;
        return _id++;
    }
}

С помощью статического счетчика каждый вызов NextID() будет возвращать следующий Id;