ASP.NET MVC Framework에서 여러 제출 단추를 어떻게 처리합니까?


733

동일한 양식의 여러 제출 버튼을 처리하는 쉬운 방법이 있습니까? 예를 들면 다음과 같습니다.

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>

ASP.NET Framework Beta 에서이 작업을 수행하는 방법을 알고 있습니까? 내가 검색 한 모든 예제에는 단일 버튼이 있습니다.


6
ASP.NET Core 에서 시작할 때 언급 할 가치 가있는 것은 여기에 나열된 것보다 훨씬 쉬운 솔루션 입니다.
Steven Jeuris

이 자습서는 다음과 같은 도움이 될 수 있습니다. ASP.NET MVC의 다른 작업 메소드에 양식 제출
Hooman Bahreini을

답변:


629

다음은 Maarten Balliauw 의 게시물과 댓글에 크게 기반을 둔 다중 제출 버튼 문제에 대한 가장 깨끗한 속성 기반 솔루션 입니다.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
    public string Name { get; set; }
    public string Argument { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
            isValidName = true;
        }

        return isValidName;
    }
}

면도칼:

<form action="" method="post">
 <input type="submit" value="Save" name="action:Save" />
 <input type="submit" value="Cancel" name="action:Cancel" />
</form>

컨트롤러 :

[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(MessageModel mm) { ... }

[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(MessageModel mm) { ... }

업데이트 : Razor 페이지기본적으로 동일한 기능을 제공하는 것으로 보입니다. 새로운 개발의 경우 바람직 할 수 있습니다.


3
이 솔루션이 사용 된 다른 기술의 행복한 결혼임을 알았습니다. 완벽하게 작동하며 현지화에는 영향을 미치지 않습니다.
trevorc

17
훌륭한 솔루션 !! 최고 점수 답변보다 유용하지 않습니다
Sasha

11
이 접근법의 문제점은 return View(viewmodel)모델에 오류가있는 경우 시도 할 경우 Send인수 이름이 무엇인지에 따라 호출 된보기를 리턴하려고 시도한다는 것 입니다.
구두

15
@ 신발-방금 비슷한 것을 발견했습니다. 이 메소드를 사용하는 경우 리턴 할보기 이름을 명시 적으로 지정하십시오.return View("Index", viewModel)
ajbeaven

4
MethodInfo에 대한 반사
Vignesh Subramanian

469

제출 버튼의 이름을 지정한 다음 컨트롤러 방법에서 제출 된 값을 검사하십시오.

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>

에 게시

public class MyController : Controller {
    public ActionResult MyAction(string submitButton) {
        switch(submitButton) {
            case "Send":
                // delegate sending to another controller action
                return(Send());
            case "Cancel":
                // call another action to perform the cancellation
                return(Cancel());
            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        }
    }

    private ActionResult Cancel() {
        // process the cancellation request here.
        return(View("Cancelled"));
    }

    private ActionResult Send() {
        // perform the actual send operation here.
        return(View("SendConfirmed"));
    }

}

편집하다:

현지화 된 사이트에서 작업하도록이 방법을 확장하려면 메시지를 다른 곳에서 격리하십시오 (예 : 리소스 파일을 강력한 형식의 리소스 클래스로 컴파일)

그런 다음 코드가 다음과 같이 작동하도록 수정하십시오.

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="<%= Html.Encode(Resources.Messages.Send)%>" />
<input type="submit" name="submitButton" value="<%=Html.Encode(Resources.Messages.Cancel)%>" />
<% Html.EndForm(); %>

컨트롤러는 다음과 같아야합니다.

// Note that the localized resources aren't constants, so 
// we can't use a switch statement.

if (submitButton == Resources.Messages.Send) { 
    // delegate sending to another controller action
    return(Send());

} else if (submitButton == Resources.Messages.Cancel) {
     // call another action to perform the cancellation
     return(Cancel());
}

28
버튼에 표시되는 텍스트에 따라 너무 나쁩니다. 다국어 사용자 인터페이스에는 다소 까다 롭습니다.
Omu

3
스위치 / 케이스는 상수에서만 작동하므로 현지화 된 버전에서는 스위치 / 케이스를 사용할 수 없습니다. 다른 또는 다른 디스패치 방법으로 전환해야합니다.
mlibby

10
<button type의 값이 텍스트가 아니기 때문에 <input type 대신 <button type = "submit"을 사용해야합니다.) 그러면 다음과 같은 것을 가질 수 있습니다 : <button name = "mySubmitButton"type = "submit"value = "keyValue"> YourButtonText </ button>
J4N

4
제출 값 대신 모델을 조치에 전달하면 어떻게 작동합니까?
bizzehdee

2
jQuery를 사용하는 경우 버튼 이름을 "action"으로 지정하지 않도록주의하십시오. 라이브러리 내에서 작업 URL을 손상시키는 충돌이 발생합니다.
HotN

121

언급 된대로 조치에서 이름을 확인할 수 있지만 이것이 좋은 디자인인지 여부를 고려할 수 있습니다. 작업의 책임을 고려하고이 디자인을 버튼 이름과 같은 UI 측면에 너무 많이 연결하지 않는 것이 좋습니다. 따라서 두 가지 양식과 두 가지 조치를 사용하십시오.

<% Html.BeginForm("Send", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<% Html.EndForm(); %>

<% Html.BeginForm("Cancel", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

또한 "취소"의 경우 일반적으로 양식을 처리하지 않고 새 URL로 이동합니다. 이 경우 양식을 전혀 제출할 필요가 없으며 링크 만 있으면됩니다.

<%=Html.ActionLink("Cancel", "List", "MyController") %>

53
모든 제출 버튼에 동일한 양식 데이터가 필요하지 않은 경우에도 괜찮습니다. Dylan Beattie보다 일반적인 형식의 모든 데이터가 필요한 경우 갈 수 있습니다. 더 우아한 방법이 있습니까?
지단

3
시각적 인 프리젠 테이션에 대해서는이 경우 "취소"버튼 옆에 "보내기"버튼이 있습니까?
Kris-I

1
Dylan : 취소 버튼의 경우 데이터를 전혀 제출할 필요가 없으며 컨트롤러를 UI 요소에 연결하는 것은 좋지 않습니다. 그러나 다소 일반적인 "명령"을 만들 수 있다면 괜찮다고 생각하지만 UI 요소의 이름이므로 "submitButton"에 묶지 않을 것입니다.
Trevor de Koekkoek

1
@Kris : CSS를 사용하여 버튼을 배치 할 수 있으며 2 개의 서로 다른 양식 섹션에있을 수 있습니다.
Trevor de Koekkoek

8
진심으로? 나 외에는 다른 사람에게 냄새가 나지 않습니까?!

98

Eilon은 다음과 같이 할 수 있다고 제안합니다.

하나 이상의 버튼이있는 경우 각 버튼에 이름을 지정하여 구별 할 수 있습니다.

<input type="submit" name="SaveButton" value="Save data" />
<input type="submit" name="CancelButton" value="Cancel and go back to main page" />

컨트롤러 조치 방법에서 HTML 입력 태그 이름을 따라 이름 지정된 매개 변수를 추가 할 수 있습니다.

public ActionResult DoSomeStuff(string saveButton, string
cancelButton, ... other parameters ...)
{ ... }

해당 매개 변수 중 하나에 값이 게시되면 해당 버튼이 클릭 된 것입니다. 웹 브라우저 는 클릭 버튼 하나에 만 값을 게시합니다 . 다른 모든 값은 null입니다.

if (saveButton != null) { /* do save logic */ }
if (cancelButton != null) { /* do cancel logic */ }

할당 된 이름보다 변경 될 가능성이 높고 자바 스크립트를 활성화 할 필요가없는 제출 버튼의 value 속성에 의존하지 않기 때문에이 방법을 좋아합니다.

참조 : http://forums.asp.net/p/1369617/2865166.aspx#2865166


2
누군가이 오래된 질문에 직면하면 HTML5 <button> 요소를 사용하지 않으려는 경우 가장 깨끗한 대답입니다. HTML5가 마음에 들지 않으면 value 속성과 함께 <button>을 사용하십시오.
Kugel 2016 년

이 양식에서 아약스 호출을 만들면 어떻게해야합니까? form.serialize ()가 제출 버튼 이름을 선택하지 않는 것 같습니다.
mko

@ Kugel이 맞습니다. 이것이 여전히 가장 깨끗한 대답입니다. 감사합니다
Arif YILMAZ

45

그냥 그것에 대해 게시물을 작성 : 복수는 ASP.NET MVC로 전송 버튼 :

기본적으로, 대신 사용하여 ActionMethodSelectorAttribute내가 사용하고, ActionNameSelectorAttribute나를 액션 이름을 척 할 수있는 것은, 내가이 원하는 모든 것이다. 다행히도 ActionNameSelectorAttribute동작 이름을 지정하지 않고 현재 동작이 요청과 일치하는지 여부를 선택할 수 있습니다.

그래서 내 수업이 있습니다 (btw 나는 너무 좋아하지 않습니다).

public class HttpParamActionAttribute : ActionNameSelectorAttribute {
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
} 

다음과 같이 양식을 정의하려면 사용하십시오.

<% using (Html.BeginForm("Action", "Post")) { %>
  <!— form fields -->
  <input type="submit" name="saveDraft" value="Save Draft" />
  <input type="submit" name="publish" value="Publish" />
<% } %> 

두 가지 방법으로 컨트롤러

public class PostController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveDraft(…) {
        //…
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Publish(…) {
        //…
    } 
}

보시다시피, 속성은 아무것도 지정하지 않아도됩니다. 또한 버튼 이름은 메소드 이름으로 직접 변환됩니다. 또한 (내가 시도하지 않았 음) 이들은 정상적인 동작으로 작동해야하므로 직접 게시 할 수 있습니다.


1
아름다운! 이것이 가장 우아한 해결책이라고 생각합니다. 이는 제거 submit는 제어 흐름과 아무 관련이 없어야 순수 UI 특성 때문에 적합 고려로부터 태그. 대신, namesubmit태그 의 고유 속성은 컨트롤러의 개별 동작 방법으로 직접 변환됩니다.
Kirk Woll

+1 저에게는이 문제에 가장 적합한 솔루션입니다. 구현 한 이후로 많은 트래픽이 HttpParamActionAttribut를 통과하지만 요청을 처리하는 동안 Asp.Net MVC가 해야하는 다른 모든 작업과 비교할 때 완전히 허용됩니다. 해킹 만하면 Resharper가 'Action'작업이 존재하지 않는다고 경고하는 것을 방지하기 위해 컨트롤러에 이름이 지정된 빈 'Action'을 넣는 것입니다. 대단히 감사합니다!
사무엘

나는 모든 솔루션을 검토했으며 이것이 훌륭하고 우아하고 간단한 솔루션이라는 데 동의합니다. 훌륭한 BC는 조건문이 없으며 새로운 버튼이있을 때 새로운 컨트롤러 작업을 정의 할 수있는 강력한 방법이 있습니다. 내 클래스 MultiButtonActionHandler FYI라고 호출 함 ;-)
ejhost

36

짧고 스위트입니다.

그것은 Jeroen Dop 에 의해 답변되었습니다

<input type="submit" name="submitbutton1" value="submit1" />
<input type="submit" name="submitbutton2" value="submit2" />

코드 뒤에 이런 식으로

 if( Request.Form["submitbutton1"] != null)
{
    // Code for function 1
}
else if(Request.Form["submitButton2"] != null )
{
       // code for function 2
}

행운을 빕니다.


대박. 내가 webforms에서했던 것과 똑같습니다. 건배 친구
djack109

최고 답변보다 훨씬 간단합니다! 감사!
pabben

35

나는 이해 당사자 가 Maarten Balliauw의 솔루션을 살펴볼 것을 제안 합니다 . 나는 그것이 매우 우아하다고 생각합니다.

링크가 사라지면 MultiButton컨트롤러 작업에 적용된 속성을 사용하여 해당 작업과 관련된 버튼 클릭을 나타냅니다.


이것이 현재 우리가 사용하고있는 솔루션이며 매우 깔끔합니다. 그래도 MVC 2입니까?
Simon 계속

이것은 아름답다! 나는 이것을 전에 보지 못했다! 하나의 버튼 만 사용하기 위해 여러 제출을 사용하는 솔루션을 다시 디자인하고 싶다는 데 동의하지만, 나는 지금 막강한 상황에 처해 있어야합니다. 이 답변은 이겼어야합니다!
Rikon

이것은 훌륭한 솔루션입니다. 매우 깨끗
Arnej65

이 접근 방식을 시도했지만 MVC3에서 작동하지 못했습니다. # 1 투표권 자의 변형이 저에게 효과적이었습니다.
Scott Lawrence

짧고 달콤한 .. mvc 3+에는 해당되지 않음
Piotr Kula

21

버튼의 이름을 지정하고 값을 지정할 수 있어야합니다. 그런 다음이 이름을 조치에 대한 인수로 맵핑하십시오. 또는 2 개의 개별 동작 링크 또는 2 개의 양식을 사용하십시오.


지금까지 내가 본 가장 깨끗하고 쉬운 솔루션.
Jason Evans

13

당신은 쓸 수 있습니다 :

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="button" value="Send" />
<input type="submit" name="button" value="Cancel" />
<% Html.EndForm(); %>

그리고 페이지에서 name == "Send"또는 name == "Cancel"인지 확인하십시오 ...


1
이것은 효과가 있지만 같은 이름을 가진 두 가지 요소를 갖는 것은 잘못된 습관이라고 생각합니다.
Péter

1
필요하지 않습니다. 입력을 사용하는 방법에 따라 다릅니다. 동일한 이름을 가진 여러 요소를 가질 수 있으며 여러 데이터를 수신 할 것으로 예상됩니다 (라디오 단추 및 확인란 작동 방식). 그러나 네, 만약 당신이이 방법을 사용하고 있다면 "잘못"하고 있기 때문입니다 ... 그 때문에 "당신은 할 수 있지만" "당신은하지 말아야합니다": P
Ironicnet

12

내가 ActionSelectName에 대해 싫어하는 점은 컨트롤러의 모든 작업 메소드에 대해 IsValidName이 호출된다는 것입니다. 왜 이런 식으로 작동하는지 모르겠습니다. 나는 모든 버튼의 기능에 따라 다른 이름을 가진 솔루션을 좋아하지만 액션 메서드에 폼의 버튼만큼 많은 매개 변수가 있어야한다는 사실이 마음에 들지 않습니다. 모든 버튼 유형에 대한 열거 형을 만들었습니다.

public enum ButtonType
{
    Submit,
    Cancel,
    Delete
}

ActionSelectName 대신 ActionFilter를 사용합니다.

public class MultipleButtonsEnumAttribute : ActionFilterAttribute
{
    public Type EnumType { get; set; }

    public MultipleButtonsEnumAttribute(Type enumType)
    {
        EnumType = enumType;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        foreach (var key in filterContext.HttpContext.Request.Form.AllKeys)
        {
            if (Enum.IsDefined(EnumType, key))
            {
                var pDesc = filterContext.ActionDescriptor.GetParameters()
                    .FirstOrDefault(x => x.ParameterType == EnumType);
                filterContext.ActionParameters[pDesc.ParameterName] = Enum.Parse(EnumType, key);
                break;
            }
        }
    }
}

필터는 양식 데이터에서 단추 이름을 찾고 단추 이름이 열거 형에 정의 된 단추 유형과 일치하면 조치 매개 변수 중에서 ButtonType 매개 변수를 찾습니다.

[MultipleButtonsEnumAttribute(typeof(ButtonType))]
public ActionResult Manage(ButtonType buttonPressed, ManageViewModel model)
{
    if (button == ButtonType.Cancel)
    {
        return RedirectToAction("Index", "Home");
    }
    //and so on
    return View(model)
}

그런 다음보기에서 다음을 사용할 수 있습니다.

<input type="submit" value="Button Cancel" name="@ButtonType.Cancel" />
<input type="submit" value="Button Submit" name="@ButtonType.Submit" />

11

나에게 가장 적합한 것은 다음과 같습니다.

<input type="submit" value="Delete" name="onDelete" />
<input type="submit" value="Save" name="onSave" />


public ActionResult Practice(MyModel model, string onSave, string onDelete)
{
    if (onDelete != null)
    {
        // Delete the object
        ...
        return EmptyResult();
    }

    // Save the object
    ...
    return EmptyResult();
}

컨트롤러 메서드에서 onDelete 및 onSave에 대해 null 값을 얻습니다. 왜 그런지 아십니까?
Diganta Kumar

해당 버튼을 클릭하면 null이되지 않습니다. null을 얻으려면 어떤 버튼을 클릭합니까?
Sergey

11

나는이 '문제'를 보았지만 다음을 추가하여 다소 논리적 인 해결책을 찾았습니다. name 속성 . 다른 언어로이 문제가 발생한 것을 기억하지 못했습니다.

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

  • ...
  • 양식에 둘 이상의 제출 단추가 포함 된 경우 활성화 된 제출 단추 만 성공합니다.
  • ...

다음 코드의 의미 value속성이 지역화, 변경 될 수 있으며,없이 국제화 필요 추가 코드가 강력한 형식의 리소스 파일이나 상수를 확인합니다.

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="send" value="Send" />
<input type="submit" name="cancel" value="Cancel" />
<input type="submit" name="draft" value="Save as draft" />
<% Html.EndForm(); %>`

수신 측에서는 알려진 제출 유형이 아닌지 확인하기 만하면됩니다. null

public ActionResult YourAction(YourModel model) {

    if(Request["send"] != null) {

        // we got a send

    }else if(Request["cancel"]) {

        // we got a cancel, but would you really want to post data for this?

    }else if(Request["draft"]) {

        // we got a draft

    }

}

이것은 우리가 ASP.NET WebForms 기능을 원했지만 MVC 내에서 간단한 웹 앱에 사용하기로 선택한 솔루션입니다.
BrandonG

10

HTML 5 사용에 대한 제한이없는 경우 속성 <button>과 함께 태그를 사용할 수 있습니다 formaction.

<form action="demo_form.asp" method="get">
   First name: <input type="text" name="fname" /><br />
   Last name: <input type="text" name="lname" /><br />
   <button type="submit">Submit</button><br />
   <button type="submit" formaction="demo_admin.asp">Submit as admin</button>
</form>

참조 : http://www.w3schools.com/html5/att_button_formaction.asp


9

브라우저가 입력 버튼에 대한 속성 구성을 지원하는 경우 (IE 10+, 다른 브라우저에 대해서는 잘 모름) 다음이 작동합니다.

@using (Html.BeginForm()){
    //put form inputs here

<input id="sendBtn" value="Send" type="submit" formaction="@Url.Action("Name Of Send Action")" />

<input id="cancelBtn" value="Cancel" type="submit" formaction="@Url.Action("Name of Cancel Action") />

}

아래 답변을 살펴보십시오. 초안 사양에 의존하지 않습니다. 귀하의 답변에 따라 다른 액션 URL을 가질 수 있습니다.
Tom Hofman

9

위의 문제를 해결할 수있는 세 가지 방법이 있습니다

  1. HTML 방식
  2. jquery 방법
  3. “ActionNameSelectorAttribute”방식

아래는 세 가지 접근 방식을 모두 설명하는 비디오입니다.

https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940

HTML 방식 :-

HTML 방식으로 두 개의 양식을 작성하고 각 양식 안에 "제출"단추를 배치해야합니다. 그리고 모든 양식의 작업은 다른 / 각각의 작업을 가리 킵니다. 아래 코드는 첫 번째 양식이 "Action1"에 게시되고 두 번째 양식은 클릭 한 "Submit"단추에 따라 "Action2"에 게시되는 것을 볼 수 있습니다.

<form action="Action1" method=post>
<input type=”submit name=”Submit1”/>
</form>

<form action="Action2" method=post>
<input type=”submit name=”Submit2”>
</form>

아약스 방법 :-

Ajax 애호가라면이 두 번째 옵션이 더 자극적입니다. Ajax 방식으로 두 개의 다른 함수“Fun1”및“Fun1”을 작성할 수 있습니다 (아래 코드 참조). 이 함수는 JQUERY 또는 다른 프레임 워크를 사용하여 Ajax를 호출합니다. 이러한 각 기능은 "제출"버튼의 "OnClick"이벤트와 바인딩됩니다. 이 함수들 각각은 각각의 액션 이름을 호출합니다.

<Script language="javascript">
function Fun1()
{
$.post(“/Action1”,null,CallBack1);
}
function Fun2()
{
$.post(“/Action2”,null,CallBack2);
}
</Script>

<form action="/Action1" method=post>
<input type=submit name=sub1 onclick=”Fun2()”/>
</form>
<form action="/Action2" method=post>
<input type=submit name=sub2 onclick=”Fun1()”/>
</form>

"ActionNameSelectorAttribute"사용 :-

이것은 훌륭하고 깨끗한 옵션입니다. "ActionNameSelectorAttribute"는 실행할 수있는 조치를 결정하는 의사 결정 논리를 작성할 수있는 간단한 속성 클래스입니다.

첫 번째는 HTML에서 서버에서 식별하기 위해 제출 버튼에 적절한 이름을 넣어야한다는 것입니다.

버튼 이름에“저장”과“삭제”를 넣었 음을 알 수 있습니다. 또한 특정 조치 이름이 아닌 제어기 이름을 "고객"으로 지정한 조치에서 알 수 있습니다. 동작 이름은 "ActionNameSelectorAttribute"에 의해 결정됩니다.

<form action=”Customer method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>

따라서 제출 단추를 클릭하면 먼저 "ActionNameSelector"속성에 도달 한 후 실행 된 제출에 따라 적절한 조치를 호출합니다.

여기에 이미지 설명을 입력하십시오

첫 번째 단계는 "ActionNameSelectorAttribute"클래스에서 상속되는 클래스를 만드는 것입니다. 이 클래스에서는 간단한 속성“Name”을 만들었습니다.

또한 true 또는 flase를 반환하는“IsValidName”함수를 재정의해야합니다. 이 함수는 액션의 실행 여부에 관계없이 로직을 작성하는 곳입니다. 따라서이 함수가 true를 반환하면 작업이 실행되거나 그렇지 않은 경우입니다.

public class SubmitButtonSelector : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
        {
            // Try to find out if the name exists in the data sent from form
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
            if (value != null)
            {
                return true;
            }
            return false;

        }
    }

위 함수의 핵심은 아래 코드에 있습니다. "ValueProvider"컬렉션에는 양식에서 게시 된 모든 데이터가 있습니다. 따라서 먼저 "Name"값을 찾고 HTTP 요청에서 발견되면 true를 반환하거나 그렇지 않으면 false를 반환합니다.

var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
      {
        return true;
      }
      return false;

그런 다음이 속성 클래스를 해당 조치에 장식하고 각각의 "이름"값을 제공 할 수 있습니다. 따라서 제출이이 조치를 수행 중이고 이름이 HTML 제출 단추 이름과 일치하면 조치를 추가로 실행하거나 그렇지 않으면 수행하지 않습니다.

public class CustomerController : Controller
{
        [SubmitButtonSelector(Name="Save")]
        public ActionResult Save()
        {
            return Content("Save Called");
        }
        [SubmitButtonSelector(Name = "Delete")]
        public ActionResult Delete()
        {
            return Content("Delete Called");
        }
}

7

David Findley는 자신의 ASP.Net 웹 로그에서이 작업을 수행하기위한 3 가지 옵션을 작성합니다.

그의 솔루션과 각각의 장단점을 보려면 동일한 양식의 여러 버튼 기사를 읽으십시오 . IMHO는 당신이 당신의 행동을 꾸미는 속성을 사용하는 매우 우아한 솔루션을 제공합니다.


7

이것이 내가 사용하는 기술이며 아직 여기에서 볼 수 없습니다. 이 솔루션에 영감을주는 링크 (Saajid Ismail이 게시)는 http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form입니다 .aspx ). 그것은 문제없이 현지화를 수행하기 위해 Dylan Beattie의 답변을 조정합니다.

보기에서 :

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<button name="button" value="send"><%: Resources.Messages.Send %></button>
<button name="button" value="cancel"><%: Resources.Messages.Cancel %></button>
<% Html.EndForm(); %>

컨트롤러에서 :

public class MyController : Controller 
{
    public ActionResult MyAction(string button)
    {
         switch(button)
         {
             case "send":
                 this.DoSend();
                 break;
             case "cancel":
                 this.DoCancel();
                 break;
         }
    }
}

Ironicnet이 제공 한 솔루션처럼 보입니다.
크리스 반 데르 마스트

확실히 비슷하지만 현지화와 컨트롤러 코드를 모두 보여줍니다.이 스레드 에서이 방식으로 수행하지 않은 것입니다. 이 작업을 수행하는 동안이 스레드를 발견하고 같은 보트에있을 수있는 다른 사람을 위해 내가 생각해 낸 것을 문서화하고 싶었습니다.
mlibby

1
사실, 그것은 Ironicnet의 그것과는 다릅니다. 그는 <input>요소를 사용 합니다. <button>변수 값 속성을 사용하지 않고 지역화를 수행하는 데 필요한을 사용 합니다.
mlibby

7

이 스크립트를 사용하면 모든 브라우저에서 HTML5 formaction 속성으로 작동하는 data-form-action 속성을 명확하게 지정할 수 있습니다.

$(document).on('click', '[type="submit"][data-form-action]', function(event) {
    var $this = $(this),
    var formAction = $this.attr('data-form-action'),
    $form = $($this.closest('form'));
    $form.attr('action', formAction);             
});

버튼이 포함 된 양식은 data-form-action 속성에 지정된 URL에 게시됩니다.

<button type="submit" data-form-action="different/url">Submit</button>   

jQuery 1.7이 필요합니다. 이전 버전에서는 live()대신 대신 사용해야 합니다 on().


6

여러 이미지 및 / 또는 텍스트 버튼을 처리하기 위해 작성한 확장 방법이 있습니다.

이미지 버튼 용 HTML은 다음과 같습니다.

<input id="btnJoin" name="Join" src="/content/images/buttons/btnJoin.png" 
       type="image">

또는 텍스트 제출 버튼 :

<input type="submit" class="ui-button green" name="Submit_Join" value="Add to cart"  />
<input type="submit" class="ui-button red" name="Submit_Skip" value="Not today"  />

다음은 컨트롤러에서 호출하는 확장 방법입니다 form.GetSubmitButtonName(). 이미지 버튼의 경우 .x(이미지 버튼을 클릭했음을 나타내는) 형식 매개 변수를 찾아 이름을 추출합니다. 일반 input버튼의 경우 이름으로 시작하여 Submit_이후부터 명령을 추출합니다. '명령'을 결정하는 논리를 추상화했기 때문에 서버 측 코드를 변경하지 않고 클라이언트에서 이미지 + 텍스트 버튼을 전환 할 수 있습니다.

public static class FormCollectionExtensions
{
    public static string GetSubmitButtonName(this FormCollection formCollection)
    {
        return GetSubmitButtonName(formCollection, true);
    }

    public static string GetSubmitButtonName(this FormCollection formCollection, bool throwOnError)
    {
        var imageButton = formCollection.Keys.OfType<string>().Where(x => x.EndsWith(".x")).SingleOrDefault();
        var textButton = formCollection.Keys.OfType<string>().Where(x => x.StartsWith("Submit_")).SingleOrDefault();

        if (textButton != null)
        {
            return textButton.Substring("Submit_".Length);
        }

        // we got something like AddToCart.x
        if (imageButton != null)
        {
            return imageButton.Substring(0, imageButton.Length - 2);
        }

        if (throwOnError)
        {
            throw new ApplicationException("No button found");
        }
        else
        {
            return null;
        }
    }
}

참고 : 텍스트 버튼의 경우 이름 앞에 접두사를 붙여야합니다 Submit_. 코드를 변경하지 않고도 텍스트 (디스플레이) 값을 변경할 수 있다는 것을 의미하기 때문에이 방법을 선호합니다. SELECT요소 와 달리 INPUT버튼에는 '값'만 있고 별도의 '텍스트'속성이 없습니다. 내 버튼은 다른 상황에서 다른 것을 말하지만 동일한 '명령'에 매핑됩니다. 코드를 작성하는 것보다이 방법으로 이름을 추출하는 것이 좋습니다 == "Add to cart".


예를 들어 항상 값을 확인할 수 없기 때문에 대안으로 이름을 확인하는 것이 좋습니다. 당신은 항목의 목록이 있고 각각 "삭제"버튼이 있습니다.
Max

6

나는 올바른 장소에 의견을 말할 충분한 담당자가 없지만 하루 종일 이것을 공유하고 싶습니다.

"MultipleButtonAttribute"솔루션을 구현하려고 시도하는 동안 ValueProvider.GetValue(keyValue)잘못 돌아 왔습니다 null.

4.0이어야했을 때 System.Web.MVC 버전 3.0을 참조하는 것으로 나타났습니다 (다른 어셈블리는 4.0). 프로젝트가 올바르게 업그레이드되지 않은 이유를 모르겠으며 다른 명백한 문제는 없었습니다.

당신은이 경우 ActionNameSelectorAttribute작동하지 않습니다 ... 그 보십시요.


6

나는 파티에 꽤 늦었지만 여기에 간다. Framework 4.5 이상이 필요합니다 . 기본적으로 컨트롤러 메소드 이름은 라우팅의 핵심이어야합니다.

마크 업 . 버튼 이름은"action:[controllerMethodName]"

(C # 6 nameof API를 사용하여 호출하려는 컨트롤러 메소드의 이름에 대한 유형별 참조를 제공하십시오.

<form>
    ... form fields ....
    <button name="action:@nameof(MyApp.Controllers.MyController.FundDeathStar)" type="submit" formmethod="post">Fund Death Star</button>
    <button name="action:@nameof(MyApp.Controllers.MyController.HireBoba)" type="submit" formmethod="post">Hire Boba Fett</button>
</form>

컨트롤러 :

namespace MyApp.Controllers
{
    class MyController
    {    
        [SubmitActionToThisMethod]
        public async Task<ActionResult> FundDeathStar(ImperialModel model)
        {
            await TrainStormTroopers();
            return View();
        }

        [SubmitActionToThisMethod]
        public async Task<ActionResult> HireBoba(ImperialModel model)
        {
            await RepairSlave1();
            return View();
        }
    }
}

속성 매직 . CallerMemberName선의 사용에 주목하십시오 .

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class SubmitActionToThisMethodAttribute : ActionNameSelectorAttribute
{        
    public SubmitActionToThisMethodAttribute([CallerMemberName]string ControllerMethodName = "")
    {
        controllerMethod = ControllerMethodName;
        actionFormat = string.Concat(actionConstant, ":", controllerMethod);
    }
    const string actionConstant = "action";
    readonly string actionFormat;
    readonly string controllerMethod;

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var value = controllerContext.Controller.ValueProvider.GetValue(actionFormat);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[actionConstant] = controllerMethod;
            isValidName = true;
        }
        return isValidName;
    }
}

이 방법은 훌륭하지만 내장 된 mvc 모델 바인더는 "name"속성 버튼을 사용하기 때문에 사용할 수 없습니다.
ooXei1sh 2016 년

이 솔루션의 목적은 MVC 사후 라우팅에 대한 해결 방법입니다. 개선 사항을 설명하십시오.
Aaron Hudon

6
[HttpPost]
public ActionResult ConfirmMobile(string nameValueResend, string nameValueSubmit, RegisterModel model)
    {
        var button = nameValueResend ?? nameValueSubmit;
        if (button == "Resend")
        {

        }
        else
        {

        }
    }


    Razor file Content:
    @using (Html.BeginForm()
    {
        <div class="page registration-result-page">

            <div class="page-title">
                <h1> Confirm Mobile Number</h1>
            </div>

            <div class="result">
                @Html.EditorFor(model => model.VefificationCode)
                @Html.LabelFor(model => model.VefificationCode, new { })
                @Html.ValidationMessageFor(model => model.VefificationCode)
            </div>
            <div class="buttons">
                <button type="submit" class="btn" name="nameValueResend" value="Resend">
                    Resend
                </button>
                <button type="submit" class="btn" name="nameValueSubmit" value="Verify">
                    Submit
                </button>

            </div>
            </div>

    }

이것은 양식 게시의 다른 방법을 설명하는 또 다른 유용한 링크 입니다.
Himalaya Garg

5

모든 솔루션을 종합하려고 시도하고 폼의 여러 버튼을 쉽게 처리 할 수있는 [ButtenHandler] 특성을 만들었습니다.

ASP.NET MVC의 CodeProject Multiple parameterized (localizable) 폼 버튼에 대해 설명했습니다 .

이 버튼의 간단한 경우를 처리하려면 :

<button type="submit" name="AddDepartment">Add Department</button>

다음과 같은 조치 방법이 있습니다.

[ButtonHandler()]
public ActionResult AddDepartment(Company model)
{
    model.Departments.Add(new Department());
    return View(model);
}

버튼 이름이 액션 메서드 이름과 어떻게 일치하는지 확인하십시오. 이 기사에서는 값이있는 버튼과 인덱스가있는 버튼을 사용하는 방법도 설명합니다.


5
//model
    public class input_element
        {
         public string Btn { get; set; }
        }   

//views--submit btn can be input type also...
    @using (Html.BeginForm())
    {
            <button type="submit" name="btn" value="verify">
             Verify data</button>
            <button type="submit" name="btn" value="save">
             Save data</button>    
            <button type="submit" name="btn" value="redirect">
                 Redirect</button>
    }

//controller

    public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            return View();
        }

        [HttpPost]
        public ActionResult About(input_element model)
        {
                if (model.Btn == "verify")
                {
                // the Verify button was clicked
                }
                else if (model.Btn == "save")
                {
                // the Save button was clicked
                } 
                else if (model.Btn == "redirect")
                {
                // the Redirect button was clicked
                } 
                return View();
        }

당신은 그것을 깨닫지 못했을 수도 있지만,이 같은 대답은 이미이 질문에 꽤 많이 게시되었습니다.
앤드류 이발소

2
또한 설명이없는 코드 만 포함 된 답변을 게시하는 것 같습니다. 코드가 작동하는 이유를 설명하기 위해 설명을 추가하고 질문에 대한 대답은 무엇입니까? 이것은 질문하는 사람과 함께 오는 다른 사람에게 매우 도움이 될 것입니다.
앤드류 이발소

2
물론 잘 작동합니다. 그러나 그 대답은 이미 오래 전에 다른 사람들의해 이미 주어졌습니다 . 그리고 작동 하는지에 대한 설명도 포함 되었습니다.
앤드류 이발소

5

이것이 내가 찾은 가장 좋은 방법입니다.

http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html

코드는 다음과 같습니다.

    /// <summary>
    /// ActionMethodSelector to enable submit buttons to execute specific action methods.
    /// </summary>
    public class AcceptParameterAttribute : ActionMethodSelectorAttribute
   {
        /// <summary>
        /// Gets or sets the value to use to inject the index into
        /// </summary>
       public string TargetArgument { get; set; }

       /// <summary>
       /// Gets or sets the value to use in submit button to identify which method to select. This must be unique in each controller.
       /// </summary>
       public string Action { get; set; }

       /// <summary>
       /// Gets or sets the regular expression to match the action.
       /// </summary>
       public string ActionRegex { get; set; }

       /// <summary>
       /// Determines whether the action method selection is valid for the specified controller context.
       /// </summary>
       /// <param name="controllerContext">The controller context.</param>
       /// <param name="methodInfo">Information about the action method.</param>
       /// <returns>true if the action method selection is valid for the specified controller context; otherwise, false.</returns>
       public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
       {

           if (controllerContext == null)
           {
               throw new ArgumentNullException("controllerContext");
           }

           Func<NameValueCollection> formGetter;
           Func<NameValueCollection> queryStringGetter;

           ValidationUtility.GetUnvalidatedCollections(HttpContext.Current, out formGetter, out queryStringGetter);

           var form = formGetter();
           var queryString = queryStringGetter();

           var req = form.AllKeys.Any() ? form : queryString;

           if (!string.IsNullOrEmpty(this.ActionRegex))
           {
               foreach (var key in req.AllKeys.Where(k => k.StartsWith(Action, true, System.Threading.Thread.CurrentThread.CurrentCulture)))
               {
                   if (key.Contains(":"))
                   {
                       if (key.Split(':').Count() == this.ActionRegex.Split(':').Count())
                       {
                           bool match = false;
                           for (int i = 0; i < key.Split(':').Count(); i++)
                           {
                               if (Regex.IsMatch(key.Split(':')[0], this.ActionRegex.Split(':')[0]))
                               {
                                   match = true;
                               }
                               else
                               {
                                   match = false;
                                   break;
                               }
                           }

                           if (match)
                           {
                               return !string.IsNullOrEmpty(req[key]);
                           }
                       }
                   }
                   else
                   {
                       if (Regex.IsMatch(key, this.Action + this.ActionRegex))
                       {
                           return !string.IsNullOrEmpty(req[key]);
                       }
                   }

               }
               return false;
           }
           else
           {
               return req.AllKeys.Contains(this.Action);
           }
       }
   }

코드 냄새없는 멀티 제출 버튼을 즐기십시오.

감사합니다


현재 끊어진 링크, 이것은 내가 찾을 수있는 가장 가까운 보관 버전입니다 : web.archive.org/web/20110706230408/http://blogs.sonatribe.com/…
Ian Kemp

안녕 이안-그것을 파내

4

수정 된 버전의 HttpParamActionAttribute메소드이지만 만료되거나 유효하지 않은 세션 포스트 백에서 오류를 발생시키지 않는 버그 수정. 이 현재 사이트에 문제가있는 경우 창에서 양식을 열고 당신이 클릭로 이동하기 전에 확인하려면 Save또는 Publish중복 창 및 로그 아웃을 엽니 다. 이제 첫 번째 창으로 돌아가서 두 버튼 중 하나를 사용하여 양식을 제출하십시오. 나에게 오류가 있어서이 변경으로 인해 그 문제가 해결되었습니다. 간결성을 위해 많은 것들을 생략했지만 아이디어를 얻어야합니다. 주요 부분은 ActionName속성에 포함되며 전달 된 이름이 양식을 표시하는보기의 이름인지 확인하는 것입니다.

속성 클래스

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
    private readonly string actionName;

    public HttpParamActionAttribute(string actionName)
    {
        this.actionName = actionName;
    }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals(this.actionName, StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
}

제어 장치

[Authorize(Roles="CanAddContent")]
public ActionResult CreateContent(Guid contentOwnerId)
{
    var viewModel = new ContentViewModel
    {
        ContentOwnerId = contentOwnerId
        //populate rest of view model
    }
    return View("CreateContent", viewModel);
}

[Authorize(Roles="CanAddContent"), HttpPost, HttpParamAction("CreateContent"), ValidateAntiForgeryToken]
public ActionResult SaveDraft(ContentFormModel model)
{
    //Save as draft
    return RedirectToAction("CreateContent");
}

[Authorize(Roles="CanAddContent"), HttpPost, HttpParamAction("CreateContent"), ValidateAntiForgeryToken]
public ActionResult Publish(ContentFormModel model)
{
    //publish content
    return RedirectToAction("CreateContent");
}

전망

@using (Ajax.BeginForm("CreateContent", "MyController", new { contentOwnerId = Model.ContentOwnerId }))
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(x => x.ContentOwnerId)

    <!-- Rest of your form controls -->
    <input name="SaveDraft" type="submit" value="SaveDraft" />
    <input name="Publish" type="submit" value="Publish" />
}

3

확장 방법을 사용하는 JQuery 접근 방식 :

public static MvcHtmlString SubmitButtonFor<TController>(this HtmlHelper helper, Expression<Action<TController>> action, string value) where TController : Controller
{
    RouteValueDictionary routingValues = Microsoft.Web.Mvc.Internal.ExpressionHelper.GetRouteValuesFromExpression(action);

    var onclick = string.Format("$('form').first().attr('action', '/{0}')", string.Join("/", routingValues.Values.ToArray().Where(x => x != null).Select(x => x.ToString()).ToArray()));
    var html = "<input type=\"submit\" value=\"" + value + "\" onclick=\"" + onclick + "\" />";

    return MvcHtmlString.Create(html);
}

다음과 같이 사용할 수 있습니다.

@(Html.SubmitButtonFor<FooController>(c => c.Save(null), "Save"))

그리고 다음과 같이 렌더링됩니다.

<input type="submit" value="Save" onclick="$('form').first().attr('action', '/Foo/Save')" >

3

각 제출 버튼마다 다음을 추가하십시오.

$('#btnSelector').click(function () {

    $('form').attr('action', "/Your/Action/);
    $('form').submit();

});

3

mkozicki 답변을 기반으로 약간 다른 솔루션을 생각해 냈습니다. 나는 여전히 사용 ActionNameSelectorAttribute하지만 두 개의 버튼 '저장'과 '동기화'를 처리해야했습니다. 그들은 거의 똑같아 서 두 가지 행동을 원하지 않습니다.

속성 :

public class MultipleButtonActionAttribute : ActionNameSelectorAttribute
{        
    private readonly List<string> AcceptedButtonNames;

    public MultipleButtonActionAttribute(params string[] acceptedButtonNames)
    {
        AcceptedButtonNames = acceptedButtonNames.ToList();
    }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {            
        foreach (var acceptedButtonName in AcceptedButtonNames)
        {
            var button = controllerContext.Controller.ValueProvider.GetValue(acceptedButtonName);
            if (button == null)
            {
                continue;
            }                
            controllerContext.Controller.ControllerContext.RouteData.Values.Add("ButtonName", acceptedButtonName);
            return true;
        }
        return false;
    }
}

전망

<input type="submit" value="Save" name="Save" />
<input type="submit" value="Save and Sync" name="Sync" />

제어 장치

 [MultipleButtonAction("Save", "Sync")]
 public ActionResult Sync(OrgSynchronizationEditModel model)
 {
     var btn = this.RouteData.Values["ButtonName"];

또한 행동이 다른 일을 할 경우 아마도 mkozicki 게시물을 따를 것이라고 지적하고 싶습니다.


1

HtmlHelper에 대한 ActionButton 메서드를 만들었습니다 . 이것은 약간의 노멀 입력 버튼을 생성 스크립트온 클릭 이벤트 지정된 컨트롤러 / 액션에 양식을 제출한다.

당신은 그런 도우미를 사용합니다

@Html.ActionButton("MyControllerName", "MyActionName", "button text")

이것은 다음 HTML을 생성합니다

<input type="button" value="button text" onclick="this.form.action = '/MyWebsiteFolder/MyControllerName/MyActionName'; this.form.submit();">

확장 메소드 코드는 다음과 같습니다.

VB.Net

<System.Runtime.CompilerServices.Extension()>
Function ActionButton(pHtml As HtmlHelper, pAction As String, pController As String, pRouteValues As Object, pBtnValue As String, pBtnName As String, pBtnID As String) As MvcHtmlString
    Dim urlHelperForActionLink As UrlHelper
    Dim btnTagBuilder As TagBuilder

    Dim actionLink As String
    Dim onClickEventJavascript As String

    urlHelperForActionLink = New UrlHelper(pHtml.ViewContext.RequestContext)
    If pController <> "" Then
        actionLink = urlHelperForActionLink.Action(pAction, pController, pRouteValues)
    Else
        actionLink = urlHelperForActionLink.Action(pAction, pRouteValues)
    End If
    onClickEventJavascript = "this.form.action = '" & actionLink & "'; this.form.submit();"

    btnTagBuilder = New TagBuilder("input")
    btnTagBuilder.MergeAttribute("type", "button")

    btnTagBuilder.MergeAttribute("onClick", onClickEventJavascript)

    If pBtnValue <> "" Then btnTagBuilder.MergeAttribute("value", pBtnValue)
    If pBtnName <> "" Then btnTagBuilder.MergeAttribute("name", pBtnName)
    If pBtnID <> "" Then btnTagBuilder.MergeAttribute("id", pBtnID)

    Return MvcHtmlString.Create(btnTagBuilder.ToString(TagRenderMode.Normal))
End Function

C # (C # 코드는 VB DLL에서 디 컴파일되므로 약간의 아름다움을 얻을 수 있지만 시간이 너무 짧습니다 :-))

public static MvcHtmlString ActionButton(this HtmlHelper pHtml, string pAction, string pController, object pRouteValues, string pBtnValue, string pBtnName, string pBtnID)
{
    UrlHelper urlHelperForActionLink = new UrlHelper(pHtml.ViewContext.RequestContext);
    bool flag = Operators.CompareString(pController, "", true) != 0;
    string actionLink;
    if (flag)
    {
        actionLink = urlHelperForActionLink.Action(pAction, pController, System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(pRouteValues));
    }
    else
    {
        actionLink = urlHelperForActionLink.Action(pAction, System.Runtime.CompilerServices.RuntimeHelpers.GetObjectValue(pRouteValues));
    }
    string onClickEventJavascript = "this.form.action = '" + actionLink + "'; this.form.submit();";
    TagBuilder btnTagBuilder = new TagBuilder("input");
    btnTagBuilder.MergeAttribute("type", "button");
    btnTagBuilder.MergeAttribute("onClick", onClickEventJavascript);
    flag = (Operators.CompareString(pBtnValue, "", true) != 0);
    if (flag)
    {
        btnTagBuilder.MergeAttribute("value", pBtnValue);
    }
    flag = (Operators.CompareString(pBtnName, "", true) != 0);
    if (flag)
    {
        btnTagBuilder.MergeAttribute("name", pBtnName);
    }
    flag = (Operators.CompareString(pBtnID, "", true) != 0);
    if (flag)
    {
        btnTagBuilder.MergeAttribute("id", pBtnID);
    }
    return MvcHtmlString.Create(btnTagBuilder.ToString(TagRenderMode.Normal));
}

이러한 방법에는 다양한 매개 변수가 있지만 사용 편의성을 위해 필요한 매개 변수 만 사용하는 과부하를 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.