ActionName'in Amacı


87

"ActionName" özelliğini kullanarak bir eylem yöntemi için bir takma ad ayarlamanın faydası nedir? Kullanıcıya başka bir adla bir eylem yöntemini çağırma seçeneği sunmanın gerçekten pek bir yararı görmüyorum. Takma adı belirledikten sonra, kullanıcı yalnızca takma adı kullanarak eylem yöntemini çağırabilir. Ancak bu gerekliyse, kullanıcı neden eylem yönteminin adını değiştirip daha sonra onun için bir takma ad belirlemiyor?

Birinin bana büyük fayda sağlayabileceği veya kullanmanın en iyisi olduğu bir senaryoda "ActionName" kullanımına bir örnek verebilirse gerçekten minnettar olurum.


En yaygın neden, hem GET hem de POST yöntemlerine sahip olmanız ve imzanın aynı olmasıdır. @Carlos Muñoz cevabına bakın
RickAndMSFT

Yanıtlar:


132

Eyleminize bir sayı ile başlamanıza veya .net'in bir tanımlayıcıda izin vermediği herhangi bir karakteri eklemenize izin verir. - En yaygın neden, aynı imzaya sahip iki İşlem yapmanıza izin vermesidir (herhangi bir iskeleli denetleyicinin GET / POST Silme eylemlerine bakın)

Örneğin: Url'nizde eylem adına içinde çizgi izin verebilir http://example.com/products/create-productvs http://example.com/products/createproductya http://example.com/products/create_product.

public class ProductsController {

    [ActionName("create-product")]
    public ActionResult CreateProduct() {
        return View();
    }

}

46
Ayrıca Controller, View veya File gibi yöntemlerde olabilecek eylem adlarını kullanmanıza da olanak tanır .
gram

@gram, bir diğer ad belirtmeden bir denetleyicide normal bir yöntemi çağıramaz mıyız? Bence yapabiliriz.
Hasan Fahim

2
Kendinizi adlandırmak Action View()isterseniz, sorun yaşarsınız çünkü View()mevcut denetleyicinizdeki tüm referanslar Action, temel alınan temel yöntem yerine buna çözümlenir . Bu nedenle, bunun üstesinden gelmek ActionNameiçin Vieweyleme izin vermek için niteliği kullanırsınız, ancak dahili olarak buna PublicViewveya benzeri bir ad verirsiniz .
Yapı

2
Bence yapmanız gerekecek return View("CreateProduct")ya da .NET, create-product.aspxveya gibi bir görünüm bulamama konusunda dırdır edecek create-product.cshtml- En azından benim kodum böyle çalışıyor.
Aşil

@gram Peki bunu nasıl yaparsınız? Belli ki bir öznitelikle değil.
John

61

Aynı imzaya sahip ve aynı url'ye sahip olması gereken iki İşleminiz varsa da yararlıdır.

Basit bir örnek:

public ActionResult SomeAction()
{
    ...
}

[ActionName("SomeAction")]
[HttpPost]
public ActionResult SomeActionPost()
{
    ...
}

Mantıklı, ancak hangi senaryolarda HttpPost'u parametresiz kullanıyorsunuz? JSON'u iade etmek ve GET ile güvenlik sorunlarından kaçınmak gibi olası nedenler olduğunu biliyorum. Seninkinin ne olduğunu merak ediyorum.
normalmike

2
Parametre listesi burada önemli olan kısım değildir. Daha iyi bir örnek olabilir, mesele şu ki, gerekirse bunu yapabilirsin.
Carlos Muñoz

1
"SomeActionPost" yerine "SomeAction" yazarak bunu da yapabiliriz, o zaman ActionName'in kullanımı nedir?
Jilani pasha

Aynı parametrelere sahiplerse, her iki yöntemi de aynı şekilde adlandıramazsınız. Bu durumda [ActionName], eylemi (yöntemi değil) ASP'de kayıtlı olarak yeniden adlandırır. NET MVC yönlendirme tablosunu amaçlanan bir.
Carlos Muñoz

38

Kullanıcı bir rapor indirdiğinde, csv dosyasını doğrudan Excel'e kolayca açabilmeleri için kullanıyorum.

[ActionName("GetCSV.csv")]
public ActionResult GetCSV(){
    string csv = CreateCSV();
    return new ContentResult() { Content = csv, ContentEncoding = System.Text.Encoding.UTF8, ContentType = "text/csv" };
}

2
Bu çok zekice :)
SRQ Coder

2

Bu kodu deneyin:

public class ProductsController
 {

    [ActionName("create-product")]
    public ActionResult CreateProduct() 
    {
        return View("CreateProduct");
    }

}

1

Bu sınıf, bir eylemin adı için kullanılan bir özniteliği temsil eder. Ayrıca, geliştiricilerin yöntem adından farklı bir eylem adı kullanmasına da olanak tanır.


0

Yöntem aşırı yüklemesi uygulamanız gerektiğinde de yararlıdır.

 public ActionResult ActorView()
        { 

            return View(actorsList);
        }


        [ActionName("ActorViewOverload")]
        public ActionResult ActorView(int id)
        {              
            return RedirectToAction("ActorView","Home");
        }
`

Burada bir ActorView parametre kabul etmez ve diğeri int kabul eder. Oyuncu listesini görüntülemek için kullanılan ilk yöntem, diğeri ise kimliği olan bir öğeyi 'id' olarak sildikten sonra aynı oyuncu listesini göstermek için kullanılır. Yöntem aşırı yüklemesine ihtiyaç duyduğunuz her yerde işlem adını 'ActorViewOverload' olarak kullanabilirsiniz.

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.