ASP.NET MVC - denetleyiciye parametreleri iletme


105

Aşağıdaki gibi bir eylem yöntemine sahip bir denetleyicim var:

public class InventoryController : Controller
{
    public ActionResult ViewStockNext(int firstItem)
    {
        // Do some stuff
    }
}

Ve çalıştırdığımda şunu belirten bir hata alıyorum:

Parametreler sözlüğü, 'firstItem' parametresi için 'System.Int32' türünde geçerli bir değer içermiyor. Bir parametreyi isteğe bağlı yapmak için türünün bir başvuru türü veya Null yapılabilir bir tür olması gerekir.

Bir noktada çalıştırdım ve işlevi parametresiz denemeye karar verdim. Denetleyicinin kalıcı olmadığını öğrendiğimde parametreyi geri koydum, şimdi yöntemi çağırdığımda parametreyi tanımayı reddediyor.

İşlemi çağırmak için bu url sözdizimini kullanıyorum:

http://localhost:2316/Inventory/ViewStockNext/11

Bu hatayı neden alacağım ve düzeltmek için ne yapmam gerektiğine dair bir fikriniz var mı?

Sınıfa bir tamsayı alan başka bir yöntem eklemeyi denedim, aynı nedenle başarısız oluyor. Bir dize alan bir tane eklemeyi denedim ve dize null olarak ayarlandı. Parametresiz bir tane eklemeyi denedim ve bu iyi çalışıyor, ama tabii ki ihtiyaçlarımı karşılamayacak.

Yanıtlar:


106

Rotanızın satırları boyunca ayarlanması gerekiyor {controller}/{action}/{firstItem}. Varsayılan olarak yönlendirme bırakılırsa {controller}/{action}/{id}sizin de global.asax.csdosyaya, o zaman geçmek gerekir id.

routes.MapRoute(
    "Inventory",
    "Inventory/{action}/{firstItem}",
    new { controller = "Inventory", action = "ListAll", firstItem = "" }
);

... veya buna yakın bir şey.


44
Veya "firstItem" öğesini "id" olarak yeniden adlandırın
Kyle Trauberman

8
Artı dünya çok gibi Hattın bir kısıtlamalar nesne eklemek akıllıca olur: new { firstItem = @"\d" }. Bu şekilde, yalnızca parametrenin herhangi bir sayı olması durumunda kabul eder. Normal ifadeyi istediğiniz gibi değiştirebilir ve hatta ondalık sayıların sayısını şu şekilde sınırlayabilirsiniz: new { firstItem = @"\d{4}" }- artık yalnızca 4 sayı uzunluğunda olabilir. Düzenleme: tamamen değiştirilmiş MapRoute
KristianB

86

firstItem'i id olarak değiştirebilirsiniz ve çalışacaktır

global.asax üzerindeki yönlendirmeyi değiştirebilirsiniz (bunu tavsiye etmiyorum)

ve kimsenin bundan bahsettiğine inanamıyorsanız, arayabilirsiniz:

http://localhost:2316/Inventory/ViewStockNext?firstItem=11

@ Url.Action şöyle olur:

@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});

Yaptığınız şeyin türüne göre sonuncusu daha uygun olacaktır. Ayrıca ViewStockNext eylemi yapmamayı ve bunun yerine indeksli bir ViewStock eylemi yapmayı düşünmelisiniz. (benim 2 sentim)


15

Jarret Meyer'in cevabını yeniden ifade etmek için, parametre adını 'id' olarak değiştirmeli veya aşağıdaki gibi bir yol eklemelisiniz:

routes.MapRoute(
        "ViewStockNext", // Route name
        "Inventory/ViewStockNext/{firstItem}",  // URL with parameters
        new { controller = "Inventory", action = "ViewStockNext" }  // Parameter defaults
    );

Bunun nedeni, varsayılan yolun yalnızca parametresi olmayan veya 'id' adlı bir parametreye sahip eylemleri aramasıdır.

Düzenleme: Heh, boşver Jarret gönderdikten sonra bir rota örneği ekledi.


8

veya Route Attribute ile yapın:

public class InventoryController : Controller
{
    [Route("whatever/{firstItem}")]
    public ActionResult ViewStockNext(int firstItem)
    {
        int yourNewVariable = firstItem;
        // ...
    }
}

Bu özellik, daha eski MVC sürümleriyle çalışmayabilir.
Suat Atan PhD

Ayrıca, bunun çalışması routes.MapMvcAttributeRoutes();için uygulamanın RegisterRoutes(RouteCollection)yöntemini çağırdığınızdan emin olmanız gerekir (genellikle App_Start \ RouteConfig.cs içine yapılarak). Varsayılan olarak orada olmayabilir.
Daniel Scott

7

Headspring, eylemdeki özniteliklerde parametrelerinize takma adlar eklemenize izin veren güzel bir kitaplık oluşturdu. Bu şuna benzer:

[ParameterAlias("firstItem", "id", Order = 3)]
public ActionResult ViewStockNext(int firstItem)
{
    // Do some stuff
}

Bununla, yalnızca farklı bir parametre adını işlemek için yönlendirmenizi değiştirmeniz gerekmez. Kitaplık ayrıca birden çok kez uygulamayı destekler, böylece birkaç parametre yazımını eşleyebilirsiniz (genel arayüzünüzü bozmadan yeniden düzenleme yaparken kullanışlıdır).

Bunu Nuget'ten alabilir ve Jeffrey Palermo'nun bu konudaki makalesini buradan okuyabilirsiniz.


7

public ActionResult ViewNextItem(int? id)idtamsayıyı null yapılabilir bir tür yapar, string <-> int dönüşümlerine gerek yoktur.


3

ASP.NET Core Etiket Yardımcısı özelliğini kullanma:

<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>

İronik bir şekilde, en kısa cevap en iyisidir (bu).

1

Bunu başarmanın başka bir yolu daha var (Stephen Walther'in Çağrı Cihazı örneğinde daha ayrıntılı olarak açıklanmıştır)

Esasen, görünümde bir bağlantı oluşturursunuz:

Html.ActionLink("Next page", "Index", routeData)

RouteData'da ad / değer çiftlerini belirtebilirsiniz (örneğin, routeData ["sayfa"] = 5) ve kontrolör İndeks işlevinde karşılık gelen parametreler değeri alır. Yani,

public ViewResult Index(int? page)

olacak sayfa İtiraf etmeliyim 5. olarak geçirilen bu dize ( "sayfa") automagicallylar bir değişken haline gelmesi oldukça sıradışı - ama MVC sıra diğer dillerde nasıl çalıştığını bu ...


0

"İd" nin özel olarak ele alınmasının nedeni, varsayılan yol eşlemesine eklenmesidir. Bunu değiştirmek için Global.asax.cs adresine gidin ve aşağıdaki satırı bulacaksınız:

routes.MapRoute ("Default", "{controller}/{action}/{id}", 
                 new { controller = "Home", action = "Index", id = "" });

Şununla değiştirin:

routes.MapRoute ("Default", "{controller}/{action}", 
                 new { controller = "Home", action = "Index" });

0

Veya parametre türünü dizeye değiştirmeyi deneyebilir, ardından dizeyi yöntemde bir tamsayıya dönüştürebilirsiniz. MVC'de yeniyim, ancak parametre listenizde null yapılabilir nesnelere ihtiyacınız olduğuna inanıyorum, denetleyici böyle bir parametrenin sağlanmadığını başka nasıl belirtecek? Yani...

public ActionResult ViewNextItem(string id)...
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.