ASP.NET MVC Framework'te birden çok gönderme düğmesini nasıl ele alırsınız?


733

Aynı formdan birden fazla gönderme düğmesini işlemenin kolay bir yolu var mı? Örneğin:

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

ASP.NET Framework Beta bunu nasıl bir fikir? Aradığım tüm örneklerde tek düğmeler var.


6
ASP.NET Core'dan başlayarak bahsetmeye değer , burada listelenenlerden çok daha kolay çözümler var.
Steven Jeuris

Bu eğitici yardımcı olabilir: ASP.NET
MVC'de

Yanıtlar:


629

Burada, Maarten Balliauw'un gönderisine ve yorumlarına dayanan çoklu gönderme düğmesi sorununa çoğunlukla temiz bir öznitelik tabanlı çözüm .

[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;
    }
}

Ustura:

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

ve denetleyici:

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

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

Güncelleme: Razor sayfaları kutunun dışında aynı işlevselliği sağlıyor gibi görünüyor. Yeni gelişme için tercih edilebilir.


3
Bu çözümü, kullanılan diğer tekniklerin mutlu evliliği olarak buldum. Mükemmel çalışır ve yerelleştirmeyi etkilemez.
trevorc

17
Harika bir çözüm !! En çok puan alan cevaplardan çok yararlı değil
Sasha

11
Bu yaklaşımla ilgili bir sorun return View(viewmodel), modelinizde hatalar olması durumunda Send, argüman adınızın ne olduğuna bağlı olarak adlandırılan veya döndürülen bir görünüm döndürmeye çalışacağıdır .
Ayakkabı

15
@ Ayakkabı - benzer bir şey bulduk. Bu yöntemi kullanıyorsanız, döndürülecek görünümün adını açıkça belirttiğinizden emin olun:return View("Index", viewModel)
ajbeaven

4
sadece bir bilgi, sistem eklememiz gerekiyor. MethodInfo için
yansıtma

469

Gönder düğmelerinize bir ad verin ve denetleyici yönteminizde gönderilen değeri inceleyin:

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

yayınlamak

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"));
    }

}

DÜZENLE:

Bu yaklaşımı yerelleştirilmiş sitelerle çalışacak şekilde genişletmek için iletilerinizi başka bir yerde yalıtın (örneğin, bir kaynak dosyasını güçlü yazılan bir kaynak sınıfına derleme)

Sonra kodu aşağıdaki gibi çalışacak şekilde değiştirin:

<% 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(); %>

ve kontrol cihazınız şöyle görünmelidir:

// 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
düğme üzerinde görüntülenen metne bağlı çok kötü, çok dilli bir kullanıcı arayüzü ile biraz zor
Omu

3
Switch / case yalnızca sabitlerle çalışır, bu nedenle yerelleştirilmiş sürüm switch / case'i kullanamaz. Başka bir duruma veya başka bir gönderim yöntemine geçmeniz gerekir.
mlibby

10
<girdi türü yerine <düğme türü = "gönder" kullanmalısınız, çünkü bir <düğme türünün değeri metin değildir;). Sonra böyle bir şeye sahip olabilirsiniz: <button name = "mySubmitButton" type = "gönder" value = "keyValue"> YourButtonText </button>
J4N

4
Bu, modelin yalnızca gönderim değeri yerine eyleme geçirilmesiyle nasıl çalışır?
bizzehdee

2
JQuery kullanıyorsanız düğmelerinize "eylem" adını vermemeye dikkat edin. Kütüphane içinde eylem URL'sini ihlal eden bir çakışmaya neden olur.
HotN

121

Eylemdeki adı belirtildiği gibi kontrol edebilirsiniz, ancak bunun iyi bir tasarım olup olmadığını düşünebilirsiniz. Eylemin sorumluluğunu dikkate almak ve bu tasarımı düğme adları gibi UI yönleriyle çok fazla birleştirmemek iyi bir fikirdir. Bu yüzden 2 form ve 2 eylem kullanmayı düşünün:

<% 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(); %>

Ayrıca, "İptal" durumunda, genellikle formu işlemezsiniz ve yeni bir URL'ye gidersiniz. Bu durumda formu hiç göndermenize ve sadece bir bağlantıya ihtiyacınız yoktur:

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

53
Her gönderme düğmesi için aynı form verilerine ihtiyacınız olmadığında sorun yoktur. Tüm verilere ortak formda ihtiyacınız varsa Dylan Beattie'den daha iyi bir yoldur. Bunu yapmanın daha zarif bir yolu var mı?
zidane

3
Görsel sunum hakkında, bu durumda "İptal" düğmesinin yanındaki "Gönder" düğmesi nasıl olur?
Kris-I

1
Dylan: İptal düğmesi için verileri hiç göndermenize gerek yoktur ve denetleyiciyi UI öğelerine bağlamak kötü bir uygulamadır. Eğer daha fazla veya daha az genel bir "komut" yapabilirsiniz Ancak, o zaman tamam olduğunu düşünüyorum, ama ben bir UI öğesinin adı olarak "SubmitButton" için kravat olmaz.
Trevor de Koekkoek

1
@Kris: düğmelerinizi CSS ile konumlandırabilirsiniz ve yine de 2 farklı form bölümünde bulunabilirler.
Trevor de Koekkoek

8
ciddi anlamda? bu benden başka kimseye kokmuyor mu ?!

99

Eilon bunu böyle yapabileceğinizi gösteriyor:

Birden fazla düğmeniz varsa, her düğmeye bir ad vererek aralarında ayrım yapabilirsiniz:

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

Denetleyici eylem yönteminize, HTML giriş etiketi adlarından sonra adlandırılmış parametreler ekleyebilirsiniz:

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

Bu parametrelerden birine herhangi bir değer gönderilirse, bu düğme tıklanan değerdir. Web tarayıcı sadece için bir değer yayınlayacağız biri tıklandığında var düğme. Diğer tüm değerler boş olacaktır.

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

Bu yöntem, atanan adlardan daha büyük olasılıkla değişen ve javascript'in etkinleştirilmesini gerektirmeyen gönderme düğmelerinin value özelliğine güvenmediği için beğendim

Bkz. Http://forums.asp.net/p/1369617/2865166.aspx#2865166


2
Bu eski soruya herhangi biri rastlarsa, HTML5 <düğmesi> öğelerini kullanmak istemiyorsanız bu en temiz yanıttır. HTML5'e aldırmazsanız değer özelliğiyle <düğmesi> 'ni kullanın.
Kugel

Bu formda bir ajax çağrısı oluşturursanız nasıl yapardınız? Görünüşe göre form.serialize () gönderme düğmesi adı pickup değil ..
mko

@Kugel haklı, bu hala en temiz cevap. Teşekkürler
Arif YILMAZ

45

Sadece bunun hakkında bir yazı yazdı: ASP.NET MVC ile çoklu gönderme düğmeleri :

Temel olarak, kullanmak yerine, kullanıyorum ActionMethodSelectorAttribute, ActionNameSelectorAttributeeylem adının olmasını istediğim şeymiş gibi davranmamı sağlıyor. Neyse ki, ActionNameSelectorAttributesadece eylem adını belirtmiyorum, bunun yerine mevcut eylemin istekle eşleşip eşleşmediğini seçebilirim.

Sınıfım var (btw isme çok düşkün değilim):

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;
    }
} 

Kullanmak için sadece şöyle bir form tanımlayın:

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

ve denetleyici iki yöntemle

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

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

Gördüğünüz gibi, özellik hiçbir şey belirtmenizi gerektirmez. Ayrıca, düğmelerin adı doğrudan yöntem adlarına çevrilir. Buna ek olarak (bunu denemedim) bunlar normal eylemler olarak da çalışmalıdır, böylece doğrudan herhangi birine gönderebilirsiniz.


1
Güzel! Bence bu en zarif çözüm. O ortadan kaldırır değeri arasında submitbu kontrol akış üzerinde hiçbir etkiye sahip olmalıdır saf-UI özelliği olduğundan idealdir dikkate alınmaz etiketi,. Bunun yerine, nameher bir submitetiketin benzersiz özelliği doğrudan denetleyicinizdeki ayrı bir işlem yöntemine dönüşür.
Kirk Woll

+1 Benim için bu sorun için açık ara en iyi çözüm. Uyguladığımdan beri, HttpParamActionAttribut üzerinden çok fazla trafik geçişinin olduğunu fark ettim, ancak Asp.Net MVC'nin bir isteği işlerken yapmak zorunda olduğu diğer tüm şeylerle karşılaştırıldığında, tamamen kabul edilebilir. Sadece hacklemek için Resharper'ın 'Action' eyleminin var olmadığını bana uyarmasını önlemek için kontrol cihazımda boş bir 'Action' adı koymak. Çok teşekkür ederim!
Samuel

Tüm çözümleri inceledim ve bunun güzel, zarif ve basit bir çözüm olduğunu kabul ediyorum. Büyük bc koşullu ifadeler yoktur ve yeni bir düğmeniz olduğunda yeni bir denetleyici eylemi tanımlayabileceğiniz sağlamdır. Sınıfımı çağırdı MultiButtonActionHandler FYI ;-)
ejhost

36

kısa ve süit:

Cevap Jeroen Dop

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

ve behinde kodunda bunu yapın

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

İyi şanslar.


Muhteşem. Web formlarında yaptığım gibi. Şerefe dostum
djack109

Üst cevaptan çok daha basit! Teşekkürler!
pabben

35

İlgili tarafların Maarten Balliauw'un çözümüne bir göz atmalarını öneririm . Bence çok zarif.

Bağlantının kopması durumunda, o MultiButtoneylemin hangi düğmeyi tıklatması gerektiğini belirtmek için bir denetleyici eylemine uygulanan özniteliği kullanır .


Bu şu anda kullandığımız çözüm ve çok düzgün. MVC 2 sadece mi?
Simon

Bu güzel! Bunu daha önce görmemiştim! Ben sadece tek bir düğme kullanmak için birden fazla gönderme kullanan herhangi bir çözümü yeniden tasarlamak isteyebilirsiniz kabul ederken, ben hamstrung olduğum bir noktada ve bunu yapmak gerekir. Bu cevap kazanmış olmalıydı!
Rikon

Bu harika bir çözüm. Çok temiz
Arnej65

Bu yaklaşımı denedi ve MVC3'te çalışmaya başlayamadı. # 1 oy alan bir varyasyon benim için çalıştı.
Scott Lawrence

Kısa ve tatlı .. ama mvc 3+ için değil
Piotr Kula

21

Düğmeleri adlandırabilmeli ve onlara bir değer verebilmelisiniz; ardından bu adı eyleme bağımsız değişken olarak eşleyin. Alternatif olarak, 2 ayrı eylem bağlantısı veya 2 form kullanın.


Şimdiye kadar gördüğüm en temiz ve en kolay çözüm.
Jason Evans

13

Yazabilirsiniz:

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

Ve sonra sayfada == "Gönder" veya ad == "İptal" olup olmadığını kontrol edin ...


1
Bu işe yarıyor olsa da, aynı adı taşıyan iki öğeye sahip olmanın yanlış bir uygulama olduğunu düşünüyorum.
Péter

1
Yanlış gerekli değil. Girişleri nasıl kullandığınıza bağlıdır. Aynı ada sahip birden çok öğeniz olabilir ve birden çok veri almayı bekleyebilirsiniz (radyo düğmeleri ve onay kutuları bu şekilde çalışır). Ama evet, eğer bu yöntemi kullanıyorsanız "yanlış" yaptığınız için ... Bu yüzden "Yapabilirsin" ama "
Yapmalısınız

12

ActionSelectName hakkında sevmediğim bir şey, IsValidName'in denetleyicideki her eylem yöntemi için çağrılmasıdır; Neden böyle çalıştığını bilmiyorum. Her düğmenin ne yaptığına bağlı olarak farklı bir ada sahip olduğu bir çözümü seviyorum, ancak formdaki düğmeler gibi eylem yönteminde çok fazla parametreye sahip olmanızdan hoşlanmıyorum. Tüm düğme türleri için bir numaralandırma oluşturdum:

public enum ButtonType
{
    Submit,
    Cancel,
    Delete
}

ActionSelectName yerine, bir ActionFilter kullanıyorum:

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;
            }
        }
    }
}

Filtre, form verilerinde düğme adını bulur ve düğme adı numarada tanımlanan düğme türlerinden biriyle eşleşirse, eylem parametreleri arasında ButtonType parametresini bulur:

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

ve sonra görünümlerde, kullanabilirsiniz:

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

11

İşte benim için en uygun olan şey:

<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();
}

Denetleyici yönteminde onDelete ve onSave için null değer alıyorum. Neden biliyor musun?
Diganta Kumar

Eğer ilgili düğmesine tıklarsanız, ikisi de boş olmaz. Null değerini almak için hangi düğmeyi tıklıyorsunuz?
Sergey

11

Ben de bu 'sorun' rastladım ama namenitelik ekleyerek oldukça mantıklı bir çözüm buldum . Bu sorunun başka dillerde olduğunu hatırlayamıyordum.

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

  • ...
  • Bir formda birden fazla gönderme düğmesi varsa, yalnızca etkinleştirilen gönderme düğmesi başarılı olur.
  • ...

Aşağıdaki kod Anlamı valuenitelikler lokalize, değiştirilebilir, olmadan uluslararasılaştırdı ihtiyacı ekstra kod kesinlikle yazılan kaynaklar dosyaları veya sabitleri kontrol etmek için.

<% 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(); %>`

Alıcı tarafta, yalnızca bilinen gönderim türlerinizden herhangi birinin 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

    }

}

Bu, ASP.NET WebForms işlevselliğini istediğimiz basit bir web uygulaması için ama MVC içinde kullanmayı seçtiğimiz çözümdür.
BrandonG

10

HTML 5 kullanımıyla ilgili kısıtlamalarınız yoksa <button>etiketi formactionAttribute ile kullanabilirsiniz :

<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>

Referans: http://www.w3schools.com/html5/att_button_formaction.asp


9

Tarayıcınız giriş düğmeleri için öznitelik oluşumunu destekliyorsa (IE 10+, diğer tarayıcılardan emin değilim), aşağıdakiler çalışmalıdır:

@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") />

}

Aşağıdaki cevabıma bir göz atın, taslak şartnamelere bağlı değil. Cevabınız, benimki olmayan farklı eylem URL'lerine sahip olma olasılığına izin veriyor.
Tom Hofman

9

Yukarıdaki sorunu çözmenin üç yolu vardır.

  1. HTML yolu
  2. Jquery yolu
  3. “ActionNameSelectorAttribute” yolu

Aşağıda, bu üç yaklaşımı da gösterici bir şekilde özetleyen bir video bulunmaktadır.

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

HTML yolu: -

HTML yolunda iki form oluşturmamız ve "Gönder" düğmesini formların her birinin içine yerleştirmemiz gerekir. Ve her formun eylemi farklı / ilgili eylemlere işaret edecektir. Aşağıdaki formun, ilk formun "İşlem1" e gönderildiğini ve ikinci formun, "Gönder" düğmesine tıklanmasına bağlı olarak "İşlem2" ye gönderileceğini görebilirsiniz.

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

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

Ajax yolu: -

Ajax sevgilisi olmanız durumunda bu ikinci seçenek sizi daha fazla heyecanlandıracaktır. Ajax yolunda iki farklı fonksiyon oluşturabiliriz: “Fun1” ve “Fun1”, aşağıdaki koda bakınız. Bu işlevler, JQUERY veya başka bir çerçeve kullanarak Ajax çağrıları yapar. Bu işlevlerin her biri “Gönder” düğmesinin “OnClick” olaylarıyla bağlanır. Bu işlevlerin her biri ilgili eylem adlarını çağırır.

<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” kullanarak: -

Bu harika ve temiz bir seçenektir. “ActionNameSelectorAttribute”, hangi eylemin yürütülebileceğine karar verecek karar verme mantığını yazabileceğimiz basit bir öznitelik sınıfıdır.

Bu yüzden ilk şey HTML'de, sunucuda tanımlamak için gönderme düğmelerine uygun adlar koymamız gerekiyor.

Düğme adlarına “Kaydet” ve “Sil” ifadelerini eklediğimizi görebilirsiniz. Ayrıca eylemde, belirli bir işlem adı değil, sadece denetleyici adını “Müşteri” koyduğumuzu fark edebilirsiniz. İşlem adının “ActionNameSelectorAttribute” tarafından kararlaştırılmasını bekliyoruz.

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

Gönder düğmesine tıklandığında, önce “ActionNameSelector” özelliğine vurur ve ardından hangi gönderimin tetiklendiğine bağlı olarak uygun eylemi başlatır.

resim açıklamasını buraya girin

Dolayısıyla ilk adım “ActionNameSelectorAttribute” sınıfından miras alan bir sınıf oluşturmaktır. Bu sınıfta basit bir “Ad” özelliği oluşturduk.

Ayrıca true veya flase döndüren “IsValidName” işlevini de geçersiz kılmamız gerekir. Bu işlev, bir eylemin yürütülmesi gerekip gerekmediği mantığını yazdığımız yerdir. Bu işlev true değerini döndürürse, eylem yürütülür veya yürütülmez.

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;

        }
    }

Yukarıdaki fonksiyonun ana kalbi aşağıdaki koddadır. “ValueProvider” koleksiyonu formdan gönderilen tüm verilere sahiptir. Bu yüzden önce “Ad” değerini arar ve HTTP isteğinde bulunursa true değerini döndürür veya false değerini döndürür.

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

Bu öznitelik sınıfı daha sonra ilgili eylem üzerinde dekore edilebilir ve ilgili “Ad” değeri sağlanabilir. Dolayısıyla, gönderme bu eylemi gerçekleştiriyorsa ve HTML gönderme düğmesi adıyla eşleşiyorsa, eylemi daha fazla yürütür veya yürütmez.

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 bunu yapmak için sahip olduğunuz 3 farklı seçeneği ASP.Net web günlüğüne yazıyor.

Çözümlerini ve her birinin avantajlarını ve dezavantajlarını görmek için aynı formda birden fazla düğme okuyun . IMHO, eyleminizi dekore ettiğiniz nitelikleri kullanan çok zarif bir çözüm sunuyor.


7

Kullanacağım teknik bu ve henüz burada göremiyorum. Bu çözüme ilham veren bağlantı (Saajid Ismail tarafından yayınlanan) http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Dylan Beattie'nin cevabını sorunsuz bir şekilde yerelleştirme yapmaya uyarlar.

Görünümde:

<% 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(); %>

Denetleyicide:

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

Ironicnet'in sağladığı çözüm gibi görünüyor.
Kris van der Mast

Kesinlikle benzer, ancak bu hem yerelleştirme hem de denetleyici kodunu gösterir, bu da bu iş parçacığında bu şekilde yapıldığını görmedim. Bunu nasıl yapacağını ararken bu konuyu buldum ve aynı teknede olabilecek herkes için ne bulduğumu belgelemek istedim.
mlibby

1
Aslında, bunun ötesinde Ironicnet ile aynı şey değil. <input>Elemanları kullanıyor . <button>Değişken değer öznitelikleri olmadan yerelleştirme yapmak için gerekli olan kullanın .
mlibby

7

Bu komut dosyası, tüm tarayıcılarda (göze batmayan bir şekilde) HTML5 formaction özniteliği olarak çalışacak bir veri formu eylem özniteliğinin belirtilmesine izin verir:

$(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);             
});

Düğmeyi içeren form, data-form-action özelliğinde belirtilen URL'ye gönderilir:

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

Bu jQuery 1.7 gerektirir. Önceki sürümler için live()yerine kullanmalısınız on().


6

Birden fazla görüntü ve / veya metin düğmesini işlemek için yazdığım bir uzantı yöntemi.

Resim düğmesinin HTML'si:

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

veya metin gönderme düğmesi için:

<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"  />

İşte denetleyiciden aradığınız uzantı yöntemi form.GetSubmitButtonName(). Görüntü düğmeleri için .x(bir görüntü düğmesinin tıklandığını gösterir) içeren bir form parametresi arar ve adı ayıklar. Normal inputdüğmeler için ile başlayan bir ad arar Submit_ve daha sonra komutu ayıklar. 'Komutu' belirleme mantığını soyutladığım için, sunucu tarafı kodunu değiştirmeden istemcideki görüntü + metin düğmeleri arasında geçiş yapabilirsiniz.

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;
        }
    }
}

Not: Metin düğmeleri için adın önüne önek eklemeniz gerekir Submit_. Bu şekilde, kodu değiştirmek zorunda kalmadan metin (display) değerini değiştirebileceğiniz anlamına gelir. Öğelerden farklı olarak SELECT, bir INPUTdüğmenin yalnızca bir 'değeri' vardır ve ayrı bir 'metin' özelliği yoktur. Düğmelerim farklı bağlamlar altında farklı şeyler söylüyor - ancak aynı 'komut' ile eşleşiyor. Ben kod için zorunda daha bu şekilde adı ayıklama tercih ederim == "Add to cart".


Her zaman örneğin değerini kontrol edemediğiniz için adı alternatif olarak kontrol etmeyi seviyorum. bir öğe listeniz var ve her birinin bir "Sil" düğmesi var.
Max

6

Doğru yerde yorum yapmak için yeterli temsilcisi yok, ama bütün gün bu yüzden bu yüzden paylaşmak istiyorum geçirdi.

"MultipleButtonAttribute" çözümü uygulamaya çalışırken ValueProvider.GetValue(keyValue)yanlış geri gelirdi null.

4.0 olması gerektiğinde System.Web.MVC sürüm 3.0'a başvurduğum ortaya çıktı (diğer derlemeler 4.0). Projemin neden doğru bir şekilde yükseltilmediğini bilmiyorum ve başka belirgin sorunum yoktu.

Yani eğer ActionNameSelectorAttributeçalışmıyorsa ... kontrol et.


6

Partiye oldukça geç kaldım, ama işte gidiyor ... Uygulamam mkozicki'den ödünç alıyor, ancak yanlış olması için daha az kodlanmış dizeler gerektiriyor. Framework 4.5+ gereklidir . Temel olarak, denetleyici yöntem adı, yönlendirmenin anahtarı olmalıdır.

İşaretleme . Düğme adı"action:[controllerMethodName]"

( çağırmak istediğiniz denetleyici yönteminin adına türe özgü başvuru sağlayan API # C # 6 adının kullanımına dikkat edin.

<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>

Denetleyici :

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();
        }
    }
}

Özellik Büyü . CallerMemberNameİyilik kullandığına dikkat edin .

[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;
    }
}

Bu hoş bir yaklaşım olsa da, "name" özniteliğini kullandığı için yerleşik mvc model bağlayıcıyı kullanamazsınız.
ooXei1sh

Bu çözümün amacı MVC sonrası yönlendirme konusunda bir çözümdür. Lütfen bir iyileştirme tanımlayın.
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>

    }

Bu, form gönderisinin farklı yollarını açıklayan başka bir yararlı bağlantıdır .
Himalaya Garg

5

Tüm çözümlerin bir sentezini yapmaya çalıştım ve bir form üzerinde birden çok düğmeyi işlemeyi kolaylaştıran bir [ButtenHandler] özniteliği oluşturdum.

ASP.NET MVC CodeProject birden çok parametreli (yerelleştirilebilir) form düğmeleri açıkladım .

Bu düğmenin basit durumunu ele almak için:

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

Aşağıdaki işlem yöntemine benzer bir şey elde edersiniz:

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

Düğmenin adının eylem yönteminin adıyla nasıl eşleştiğine dikkat edin. Makalede ayrıca değerlere sahip düğmelerin ve dizinlere sahip düğmelerin nasıl bulunacağı açıklanır.


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();
        }

Bunu fark etmemiş olabilirsiniz, ancak aynı cevap zaten bu soruya birkaç kez gönderildi.
Andrew Barber

2
Ayrıca, açıklama içermeyen yalnızca kod içeren yanıtlar yayınlamışsınızdır. Kodun neden çalıştığını ve soruyu sorunun cevabı haline getiren açıklamayı eklemeyi düşünür müsünüz? Bu, soruyu soran kişiye ve birlikte gelen herkese çok yardımcı olacaktır.
Andrew Barber

2
Tabii, iyi çalışıyor. Ancak bu cevap zaten uzun zaman önce başkaları tarafından verildi . Ve neden işe yaradığına dair açıklamalar da içeriyorlardı .
Andrew Barber

5

Bu bulduğum en iyi yoludur:

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

İşte kod:

    /// <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);
           }
       }
   }

Kod kokusuz çoklu gönderim düğmesinin keyfini çıkarın.

teşekkür ederim


Bağlantı şu anda bozuk, bulabildiğim en yakın arşivlenmiş sürüm: web.archive.org/web/20110706230408/http://blogs.sonatribe.com/…
Ian Kemp


4

HttpParamActionAttributeYöntemin değiştirilmiş sürümü, ancak süresi dolmuş / geçersiz oturum geri göndermelerinde hataya neden olmadığı için bir hata düzeltmesi. Bunun mevcut sitenizle ilgili bir sorun olup olmadığını görmek için formunuzu bir pencerede açın ve tıklamaya gitmeden hemen önce Saveveya Publishyinelenen bir pencere açın ve oturumu kapatın. Şimdi ilk pencerenize dönün ve iki düğmeyi kullanarak formunuzu göndermeyi deneyin. Benim için bir hata aldım, bu yüzden bu değişiklik benim için bu sorunu çözüyor. Kısaca özünde bir sürü şey atlıyorum ama bu fikri anlamanız gerekir. Anahtar bölümler ActionNameözniteliğe dahil edilir ve iletilen adın, formu gösteren Görünüm'ün adı olduğundan emin olur

Özellik Sınıfı

[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;
    }
}

kontrolör

[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");
}

Görünüm

@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

Bir genişletme yöntemi kullanarak benim JQuery yaklaşım:

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);
}

Bu şekilde kullanabilirsiniz:

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

Ve şöyle işler:

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

3

Her gönderme düğmesi için şunları ekleyin:

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

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

});

3

Mkozicki cevabına dayanarak biraz farklı bir çözüm buluyorum. Hala kullanıyorum ActionNameSelectorAttributeama iki düğme 'Kaydet' ve 'Senkronizasyon' işlemek gerekiyordu. Hemen hemen aynı şeyi yapıyorlar, bu yüzden iki işlem yapmak istemedim.

özellik :

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;
    }
}

görünüm

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

kontrolör

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

Ayrıca, eylemler farklı şeyler yaparsa, muhtemelen mkozicki gönderisini takip edeceğimi belirtmek isterim.


1

Bir oluşturduk actionButton yöntemi HtmlHelper . Bu biraz normal giriş düğmesini üretecektir javascript içinde OnClick olay belirtilen Kontrolör / Eyleme formu gönderecektir.

Yardımcıyı böyle kullanıyorsun

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

bu aşağıdaki HTML'yi oluşturur

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

Uzantı yöntemi kodu şöyledir:

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 # kodu sadece VB DLL ayrıştırılmış, bu yüzden bazı güzelleştirme alabilirsiniz ... ama zaman çok kısa :-))

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));
}

Bu yöntemlerin çeşitli parametreleri vardır, ancak kullanım kolaylığı için sadece ihtiyacınız olan parametreleri alan bazı aşırı yükler oluşturabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.