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?
'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
'c => c.MyMethod2'," Method Group "öğesinden" ActionResult "türünde delege edilemez. –
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