【问题标题】:Rendering an ActionLink programmatically以编程方式呈现 ActionLink
【发布时间】:2010-10-08 23:24:53
【问题描述】:

我有一个场景,我想以编程方式呈现 ActionLink,来自控制器的以太或理想的扩展方法。这样我就可以总结一些逻辑来显示链接并从我的视图中删除该逻辑。

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

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

有一个 RenderControl 方法采用了我一直在尝试使用的 HtmlTextWriter。我无法让它工作,并且每次在 Microsoft.Web.Mvc 程序集 (Fu​​tures) 中都会引发空引用异常。

[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

任何帮助都会很棒。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,这很好用。简而言之,我只想要为我构建的链接,我可以将其放入我自己的 html 帮助程序中。在回答下面的 Brian 时,我的观点中有这样的东西,我想用更好的东西来总结 gist.github.com/601732
    【解决方案2】:

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

    HTH。

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多