@ Html.Button이 없습니다!


81

이것은 이상합니다. @ Html.Button ()에 대한 참조가 있지만 Intellisense가 그러한 도우미를 찾지 못한다고 입력하면 ... 드롭 다운 목록, 숨김, 편집기 등이 있지만 버튼은 없습니다!

무슨 일이야?


그러한 참조는 어디에서 볼 수 있습니까?
SLaks

1
일관성에 대한 욕구는 이해하지만 실제로는 하나 (인코딩하거나 보호 할 필요가 없음)가 필요하지 않으므로 단일 html 태그를 작성하는 데 오랜 시간이 걸리기 만하면됩니다. '@ Html.Button ( "myButton", new {@class = "myClass"}) 'vs'<button class = "myClass"> myButton </ button> '
Nine Tails

4
@Russel-동의하지 않습니다-MvcHtmlString에 확장 메서드를 만들어 DOM 요소를 비활성화하고, 읽기 전용으로 만들고, 숨 깁니다. 버튼에 대한 HTML 도우미가 없기 때문에 확장 메서드를 사용할 수 없습니다. '필요가 없다'고 말하는 것은 약간 근시안적이고 순진 할 수도 있습니다.
barrypicker 2015-08-26

답변:


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
그래 ... 그들은 정말 좋은 이유가 있었음에 틀림 없다. 그렇지 않으면 큰 실수가 될 것이다.
Andrei Rînea

감사합니다. 저는 새 프로젝트를 진행 중이 었는데 html.button이 없다는 사실에 놀랐습니다
Tom Stickel 2012

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 2013-01-22

워 ... 어떻게 HtmlHelper.AnonymousObjectToHtmlAttributes전에 본 적이 없습니까?
drzaus 2014


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, 부트 스트랩 버전 3.2.0

@Html.ActionLink
(
    linkText: " Remove", 
    actionName: "Index", 
    routeValues: null, // or to pass some value -> routeValues: new { id = 1 },
    htmlAttributes: new { @class = "btn btn-success btn-sm glyphicon glyphicon-remove" }
)

버튼처럼 보이는 링크가 생성됩니다.


2
"부트 스트랩 3"이 뭐야?
ekkis

1
죄송합니다. 단어를 잘못 입력했습니다. 물론 부트 스트랩을 의미합니다. ekkis 감사합니다. 링크
Piotr Knut 2014 년

1
이것은 버튼이 아니라 버튼처럼 보이는 링크를 생성합니다.
SMUsamaShah

2
나를 위해 여는 괄호가 ActionLink와 같은 줄에 있지 않으면 컴파일되지 않습니다.
GaTechThomas 2016

GaTechThomas. 그래 그건 사실이야. 모든 것이 한 줄에 있어야합니다. 읽기 쉽게 이렇게 다시 포맷했습니다. 자신 만의 버튼 (또는 다른 것)을 만드는 것이 가장 좋지만 시간이 없거나 모양이 걱정되지 않는 경우 빠른 솔루션입니다.
Piotr Knut

1

Razor에 "버튼"HTML 도우미가없는 것 같습니다. 사용자 지정 HTML 도우미 확장에 대한 참조를 찾을 수 있습니다.

여기를 참조하십시오 : http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs


1
이상하지 않나요? 특히 사소한 경우 완전성을 위해 포함하지 않는 이유는 무엇입니까 ??
ekkis

해당 문서를 읽었지만 작동하지 않습니다. 프로젝트 루트에있는 HtmlHelpers.cs라는 파일에 도우미를 배치했으며 여기에는 "this HtmlHelper helper"라는 유일한 매개 변수가있는 문자열을 반환하는 공용 정적 메서드가있는 정적 클래스 HtmlHelpers가 포함되어 있습니다. 모든 것이 컴파일되고 .Button이 Intellisense에 나타나야하지만 그렇지 않습니다. 그 밖의 무엇을해야합니까?
ekkis

1
보기 상단에 확장 네임 스페이스에 대한 import 문을 포함 했습니까? 그게 일반적인 문제입니다. 뷰가 컴파일되는지 확인하고 싶을 수 있습니다 (프로젝트를 마우스 오른쪽 버튼으로 클릭하고 언로드를 선택합니다. 파일을 편집하려면 마우스 오른쪽 버튼을 클릭합니다.-MvcBuildViews를 true로 설정합니다. 저장하고 닫은 다음 마우스 오른쪽 버튼을 클릭하고 프로젝트를 다시로드하고 다시 컴파일합니다.
Adam Tuliper-MSFT

1
확장자라는 폴더를 만듭니다. 거기에 htmlextensions.cs 클래스를 추가하고 (네임 스페이스가 올바른지 확인) 뷰에서 다음을 사용합니다. @using Yourapp.Extensions는 문제가있는 경우 메모장을 사용하여 MvcBuildViews도 활성화합니다.
Adam Tuliper-MSFT

1
Ekkis, 프로젝트에 무엇을했는지 확실하지 않지만 HtmlHelperExtension을 생성하려면 다음을 수행해야합니다. 1) 정적 클래스를 생성합니다 (내 HtmlHelperExtensions라고 부름). 2) 해당 클래스 내에서 <Extension ( )>, 적절한 서명이 있어야합니다. 3) MvcHtmlString.Create ()를 반환합니다. 유용하고 기능적인 예는이 게시물을 참조하십시오. stackoverflow.com/questions/4896439/action-image-mvc3-razor
Ben Finkel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.