Строго типизированное действие URLC#

Место общения программистов C#
Ответить
Anonymous
 Строго типизированное действие URL

Сообщение Anonymous »

Я читал множество сообщений и блогов, похожих на

Генерацию строго типизированных URL-адресов на основе делегатов в ASP.NET MVC

Но ни один из них на самом деле не делает то, что мне хотелось бы. В настоящее время у меня есть гибридный подход, например:

Код: Выделить всё

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

public string Action(this UrlHelper url,
Expression 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;
}
}
Отлично работает, если у ваших методов контроллера нет параметров:

Код: Выделить всё

public class MyController : Controller
{
public ActionResult MyMethod()
{
return null;
}
public ActionResult MyMethod2(int id)
{
return null;
}
}
Тогда я смогу:

Код: Выделить всё

Url.Action(c => c.MyMethod())
Но если мой метод принимает параметр, мне нужно передать значение (которое я бы никогда не использовал):

Код: Выделить всё

Url.Action(c => c.MyMethod2(-1), new { id = 99 })
Итак, вопрос заключается в том, есть ли способ изменить метод расширения, чтобы он по-прежнему требовал, чтобы первый параметр был методом, определенным для типа T, который проверяет, чтобы убедиться, что возвращаемый параметр является ActionResult без фактического указания параметра, что-то вроде:

Код: Выделить всё

Url.Action(c => c.MyMethod2, new { id = 99 })
Таким образом, при этом будет передан указатель на метод (например, отражение MethodInfo) вместо Func, поэтому параметры не будут учитываться. Как бы выглядела эта подпись, если бы это было возможно?

Подробнее здесь: https://stackoverflow.com/questions/343 ... url-action
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»