Тут немає кнопки @ Html.Button!


81

це дивно. Я бачу посилання на @ Html.Button (), але коли я набираю, що Intellisense не знаходить такого помічника ... є випадаючий список, прихований, редактори тощо, але кнопки немає!

що з цим?


Де ви бачите такі посилання?
Слакс

1
Я розумію прагнення до послідовності, але насправді немає потреби в одному (нічого не кодувати і не захищати), тому все, що це було б, - це довгий спосіб написати єдиний тег html: '@ Html.Button ("myButton", новий {@class = "myClass"}) 'vs' <button class = "myClass"> myButton </button> '
Nine Tails

4
@Russel - я б не погодився - я створив методи розширення на MvcHtmlString, щоб вимкнути, зробити лише для читання та приховати елементи DOM. Оскільки для кнопок не існує помічника HTML, я не можу використовувати свої методи розширення. Сказати "немає потреби" - це трохи недалекоглядно і можливо наївно.
barrypicker

Відповіді:


69
public static class HtmlButtonExtension 
{

  public static MvcHtmlString Button(this HtmlHelper helper, 
                                     string innerHtml, 
                                     object htmlAttributes) 
  { 
    return Button(helper, innerHtml,
                  HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)
    ); 
  }

  public static MvcHtmlString Button(this HtmlHelper helper, 
                                     string innerHtml,
                                     IDictionary<string, object> htmlAttributes)
  {
      var builder = new TagBuilder("button");
      builder.InnerHtml = innerHtml;
      builder.MergeAttributes(htmlAttributes);
      return MvcHtmlString.Create(builder.ToString());
  }
}

1
Так ... у них, мабуть, була якась поважна причина, інакше це була б величезна помилка.
Андрій Рінея,

Дякую, я був на новому проекті і був здивований тим, що не побачив html.button
Tom Stickel

7
Якщо ви хочете використовувати @Html.Button("ButtonText", new {Name = "name", Value = "value" })формат, додайте цей клас:public static MvcHtmlString Button(this HtmlHelper helper, string text, object htmlAttributes) { return Button(helper, text, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); }
Mason240

1
Хороший дзвінок @ Mason240. Я оновив свою відповідь перевантаженням, як ви запропонували.
jessegavin

ого ... як я ніколи HtmlHelper.AnonymousObjectToHtmlAttributesраніше не бачив ?
drzaus

9

Починаючи з mvc preview 3 (не mvc3), помічника кнопок немає

про це згадувалося в минулому, наприклад: http://blog.wekeroad.com/blog/aspnet-mvc-preview-using-the-mvc-ui-helpers/, але прокручувати своє власне є тривіальним - у мене є основа для нього десь тут мені доведеться його розкопати, але по суті просто створити новий Html.ButtonFor і скопіювати вихідний код з Html.LabelFor і змінити вихідні дані, щоб створити тег type = "button".


9

Щоб розширити прийняту відповідь , ви можете прив’язати кнопку подання до властивості моделі, але мати інший текст:

@Html.ButtonFor(m => m.Action, Model.LabelForCurrentAction(), new { @class = "btn btn-primary btn-large", type = "submit" })

Використовуючи наступний дещо модифікований Buttonдопоміжний клас :

/// <summary>
/// Via /programming/5955571/theres-no-html-button
/// </summary>
public static class HtmlButtonExtension
{

    public static MvcHtmlString Button(this HtmlHelper helper, object innerHtml, object htmlAttributes)
    {
        return helper.Button(innerHtml, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    public static MvcHtmlString Button(this HtmlHelper helper, object innerHtml, IDictionary<string, object> htmlAttributes)
    {
        var builder = new TagBuilder("button") { InnerHtml = innerHtml.ToString() };
        builder.MergeAttributes(htmlAttributes);
        return MvcHtmlString.Create(builder.ToString());
    }

    public static MvcHtmlString ButtonFor<TModel, TField>(this HtmlHelper<TModel> html,
                                                        Expression<Func<TModel, TField>> property,
                                                        object innerHtml,
                                                        object htmlAttributes)
    {
        // lazily based on TextAreaFor

        var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

        var name = ExpressionHelper.GetExpressionText(property);
        var metadata = ModelMetadata.FromLambdaExpression(property, html.ViewData);

        string fullName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

        ModelState modelState;
        if (html.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0)
        {
            if( !attrs.ContainsKey("class") ) attrs["class"] = string.Empty;
            attrs["class"] += " " + HtmlHelper.ValidationInputCssClassName;
            attrs["class"] = attrs["class"].ToString().Trim();
        }
        var validation = html.GetUnobtrusiveValidationAttributes(name, metadata);
        if(null != validation) foreach(var v in validation) attrs.Add(v.Key, v.Value);

        string value;
        if (modelState != null && modelState.Value != null)
        {
            value = modelState.Value.AttemptedValue;
        }
        else if (metadata.Model != null)
        {
            value = metadata.Model.ToString();
        }
        else
        {
            value = String.Empty;
        }

        attrs["name"] = name;
        attrs["Value"] = value;
        return html.Button(innerHtml, attrs);
    }
}

8

MVC5, Bootstrap версії 3.2.0

Це створить посилання, схоже на кнопку.


2
що таке "Bootstrap 3"?
ekkis

1
Вибачте, я ввів неправильне слово. Звичайно, я маю на увазі Bootstrap. Дякую ekkis. посилання
Piotr Knut

1
Це не створює кнопку, а натомість посилання, яке схоже на кнопку.
SMUsamaShah

2
Для мене це не вдається скомпілювати, якщо відкриваюча дужка не знаходиться в тому ж рядку, що і ActionLink.
GaTechThomas

GaTechThomas. Так, це правда. Все повинно бути в одному рядку. Я переформатував його таким чином, щоб його було легше читати. Найкраще створити власну кнопку (або щось інше), але якщо у вас немає часу на це або вас не турбує її поява, це швидке рішення.
Piotr Knut

1

Схоже, Razor не має помічника HTML "Button". Ймовірно, ви знайдете посилання на спеціально розроблене допоміжне розширення HTML.

Дивіться тут: http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs


1
хіба це не здається дивним? особливо якщо це тривіально, чому б не включити його для повноти ??
ekkis

Я прочитав цей документ, але не можу змусити його працювати. Я помістив свого помічника у файл під назвою HtmlHelpers.cs у корені проекту, і він містить статичний клас HtmlHelpers із загальнодоступним статичним методом, який повертає рядок, єдиним параметром якого є "цей помічник HtmlHelper". все компілюється, і кнопка. повинна з'явитися в Intellisense, але це не так ... що я ще повинен робити?
ekkis

1
Ви включили оператор імпорту для простору імен розширення у верхній частині подання? це звичайне питання тут. Ви можете переконатися , що ваші думки компіляції (клацніть правою кнопкою миші на проекті, виберіть розвантажити правою кнопкою миші для редагування файлу - .. набір MvcBuildViews до істинним зберегти і закрити, і клацніть правою кнопкою миші і перезавантажити проект і скомпілювати знову.
Адам Tuliper - MSFT

1
створити папку з назвою розширення. додайте туди клас htmlextensions.cs (переконавшись, що простір імен правильний), а потім у своєму поданні використовуйте: @ using Yourapp. Розширення також увімкніть MvcBuildViews за допомогою блокнота, якщо у вас проблема.
Адам Туліпер - MSFT

1
Еккіс, Не впевнений, що ти зробив із своїм проектом, але для створення HtmlHelperExtension потрібно зробити наступне: 1) Створити статичний клас (я називаю мій HtmlHelperExtensions) 2) У цьому класі зробити загальнодоступні методи, анотовані як <Extension ( )>, з належним підписом. 3) Повернути MvcHtmlString.Create (). Дивіться цю публікацію як корисний та функціональний приклад: stackoverflow.com/questions/4896439/action-image-mvc3-razor
Бен Фінкель,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.