Самый простой способ - использовать имя контроллера и имя действия в виде строки в вашей модели. Тогда вы можете использовать не строго типизированную перегрузку actionlink. Примерно так:
<%=Html.ActionLink(Model.Action, Model.Controller, new { param1 = 1, param2 = 2 })%>
И используйте это так:
<%Html.RenderPartial("PartialName", new PartialModel{Controller = "Person", Action = "Publications"})%>
Если вы хотите использовать строго типизированную версию, вы можете сделать что-то вроде этого:
//Model for your partial view
public class PartialModel<TController> where TController : Controller
{
public Func<int, int, Expression<Action<TController>>> GetLinkAction { get; set; }
}
//Render the action link in your partial
<%=Html.ActionLink(Model.GetLinkAction(1, 2))%>
//Render the partialview in any page
<%Html.RenderPartial("PartialName", new PartialModel<PersonController> { GetLinkAction = (param1, param2) => x => x.Publications(param1, param2) })%>
Вам, конечно, придется настроить это для параметров, которые у вас есть. Хорошая особенность строго типизированного способа заключается в том, что методы не должны иметь одинаковую сигнатуру и имена параметров.