我有一个场景,我想以编程方式渲染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
任何帮助都会很棒。
答案 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。