2010-09-28 58 views
0

我有一個場景,我想以編程方式呈現ActionLink,從控制器或理想的擴展方法以太。這樣我就可以包裝一些邏輯來顯示鏈接並從我的視圖中刪除該邏輯。以編程方式呈現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 

任何幫助將是偉大的。

回答

3

假設你在一個控制器的時候,你可以使用以下命令:

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

但我不完全相信正是你到底想要看到的東西。

+0

謝謝,這個作品很棒。總之,我只是想爲我建立的鏈接,我可以把我自己的HTML幫手。回答Brian下面,我在我的觀點中有這樣的想法,我想用更好的東西包裝起來http://gist.github.com/601732 – 2010-09-28 20:41:08

1

最好的方法是在模型中存儲一個標誌,由控制器設置,是否顯示鏈接,以及如何顯示/隱藏鏈接。否則,你可以看看用這個邏輯創建你自己的幫助器方法;它本質上是渲染一個標記,並使用UrlHelper類(Action方法)來生成url。您也可以在控制器中使用UrlHelper,並在模型中或在ViewData中傳遞鏈接。

HTH。

相關問題