以编程方式呈现ActionLink

时间:2010-09-28 19:21:07

标签: asp.net-mvc asp.net-mvc-2

我有一个场景,我想以编程方式渲染ActionLink,从控制器渲染以太,或者理想情况下是扩展方法。这样我就可以结束一些逻辑来显示链接并从我的视图中删除该逻辑。

我可以使用CodePlex的MVC Futures项目创建一个ActionLink。

ActionLink actionLink = new ActionLink();
actionLink.ActionName = "MyActionName";
actionLink.ControllerName = "MyControllerName";

有一个RenderControl方法,它采用了我一直在尝试使用的HtmlTextWriter。我无法使其工作,并且每次在Microsoft.Web.Mvc程序集(Futures)中抛出空引用异常。

[NullReferenceException: Object reference not set to an instance of an object.]
   Microsoft.Web.Mvc.Controls.ActionLink.Render(HtmlTextWriter writer) +643
   System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +99
   System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
   MvcSpike.Controllers.HomeController.Index() in C:\...\Controllers\HomeController.cs:33
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +74
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +52
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
   System.Web.Mvc.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +314
   System.Web.Mvc.Controller.ExecuteCore() +105
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +39
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +34
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +59
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +44
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8679150
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:3)

假设您在控制器中,您可以使用以下内容:

string anchor = HtmlHelper.GenerateLink(
                    this.Request.RequestContext,
                    RouteTable.Routes,
                    "Link name",
                    "",
                    "MyActionName",
                    "MyControllerName",
                    null,
                    null);

但我不完全确定你到底想要看到的是什么。

答案 1 :(得分:1)

最好的方法是在模型中存储一个标志,由控制器设置,是否显示链接,并以这种方式显示/隐藏它。否则,您可以使用此逻辑创建自己的辅助方法;它实际上是渲染一个标记,并使用UrlHelper类,Action方法来生成url。您也可以在控制器中使用UrlHelper,也可以通过模型或ViewData等传递链接。

HTH。