2015-12-17 29 views
7

okudum birden mesajlar ve bloglarKesinlikle daktilo url eylem

Delegate-based strongly-typed URL generation in ASP.NET MVC

benzer Ama bunların hiçbiri gerçekten oldukça ben yapmak istiyorum ne.

Url.Action<MyController>(c => c.MyMethod()) 

Ama eğer: I can Sonra

public class MyController : Controller 
{ 
    public ActionResult MyMethod() 
    { 
    return null; 
    } 
    public ActionResult MyMethod2(int id) 
    { 
    return null; 
    } 
} 

: Eğer kontrolör yöntemleri herhangi bir parametre yok eğer

// shortened for Brevity 
public static Exts 
{ 
    public string Action(this UrlHelper url, 
    Expression<Func<T, ActionResult>> expression) 
    where T : ControllerBase 
    { 
    return Exts.Action(url, expression, null); 
    } 

    public string Action(this UrlHelper url, 
    Expression<Func<T, ActionResult>> expression, 
    object routeValues) 
    where T : ControllerBase 
    { 
    string controller; 
    string action; 

    // extension method 
    expression.GetControllerAndAction(out controller, out action); 

    var result = url.Action(action, controller, routeValues); 

    return result; 
    } 
} 

büyük İşleri: Şu anda böyle bir melez yaklaşım benim yöntemim bir parametre alır, o zaman bir değeri (asla kullanmayacağım) iletmem gerekir:

Url.Action<MyController>(c => c.MyMethod2(-1), new { id = 99 }) 

Yani soru hala ilk parametreyi gerektirecek uzatma yöntemini değiştirmek için bir yol, bir yöntem dönüş parametresi aslında bir parametre belirtmeden bir ActionResult olduğundan emin olmak için denetimi yapar o tip T üzerine tanımlanacak, bir şey var gibi:

Url.Action<MyController>(c => c.MyMethod2, new { id = 99 }) 

Yani bu yerine Func<> (a yansıması MethodInfo gibi) yöntemine için bir işaretçi geçerdi, bu nedenle parametreleri umurumda olmaz. İmza mümkün olsaydı neye benziyordu?

+0

'c.MyMethod2' ile _group_ yöntemine işaret ediyorsunuz, bunlardan herhangi biri başka bir şeye dönebiliyor ... Ama eminim ki bunu sağlayan kitaplıklar gördüm. Belki de bazı yansıma sihirleri yapabilir ve "GetControllerAndAction" ifadesini, sağlanan parametrelerle eşleşen grubun yönteminin gerçekten de "ActionResult" değerini döndürdüğünü kontrol edebilirsiniz. Bu tam olarak size tam olarak aradığınız dergi güvenliğini vermeyecektir, ancak denetleyicinizde yine de işlem dışı yöntemlere sahip olmanız gerekir. – CodeCaster

+0

'c => c.MyMethod2'," Method Group "öğesinden" ActionResult "türünde delege edilemez. –

+2

Elbette haklısınız, bu sadece geçerli denetleyicide çalışır, görünümde değil. Neden bunun yerine 'c => c.MyMethod2 (99)' kullanmıyorsunuz (argümanlar almak için 'MethodCallExpression.Arguments' kullanarak)? – CodeCaster

cevap

İlgili konular