VB.Net,MVC3和Razor - 修改ActionLink Helper

时间:2011-06-21 19:26:43

标签: vb.net asp.net-mvc-3 razor html-helper

问题:如何修改或创建自己的Html.ActionLink帮助程序来接受和处理作为空字符串/什么都没有传入的第一个参数(linkText)?

详细信息:我目前有一个强类型视图,它传递的是包含搜索结果的模型。我的视图循环遍历模型中的每个项目,并尝试使用以下代码显示指向联系人的链接:

@Html.ActionLink(currentItem.ContactName, "contact", "details", New With { .id = currentItem.ContactID }, Nothing)

通常这可以正常工作,但我的搜索结果中的每个项目都不具有ContactName。第一个参数为空时,Html.ActionLink助手错误。如果它有帮助,这里是ContactName的模型属性(由于数据库优先从模板生成,所以我不相信它可以被修改):

Public Property ContactName As String

我想要一个帮助函数,如果ContactName是一个空字符串/什么都没有返回任何内容。

我猜我需要扩展这个帮助器,我一直在努力在VB.net中找到任何好的,最新的资源来扩展辅助函数。如果将其他方法视为最佳实践,则非常欢迎。我在ASP.net 4.0框架中使用VB.net,MVC3和Razor。在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

为了实现这一点,我在我的解决方案中创建了一个Helpers文件夹,并添加了一个新模块HtmlHelperExtensions.vb,这里有详细介绍(感谢Darin Dimitrov提供的模块代码):

Imports System.Runtime.CompilerServices

Namespace MyHtmlHelpers
Public Module HtmlHelperExtensions
    'Function to extend the ActionLink helper
    'Function will return an empty html string for empty or null linkText values
    <Extension()> _
    Public Function MyActionLink(
            ByVal html As HtmlHelper            , _
            ByVal linkText As String            , _
            ByVal actionName As String          , _
            ByVal controllerName As String      , _
            ByVal routeValues As Object         , _
            ByVal htmlAttributes As Object
        ) As IHtmlString

        If String.IsNullOrEmpty(linkText) Then
            Return MvcHtmlString.Empty
        End If

        Return html.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes)
    End Function
End Module
End Namespace

然后我必须进入我的解决方案的View文件夹中的Web.Config文件,以便将其添加为公共视图命名空间,添加为namespace =“solutionname.namespace”(注意最后添加命名空间标记) :

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="BrokerCRM.MyHtmlHelpers" />
  </namespaces>
</pages>

然后,我必须关闭并重新打开我的视图(.vbhtml),以便为我的新html帮助程序工作。

答案 1 :(得分:1)

Module HtmlLinkExtensionsModule
    <System.Runtime.CompilerServices.Extension()> _
    Public Function MyActionLink(html As HtmlHelper, linkText As String, actionName As String, controllerName As String, routeValues As Object, htmlAttributes As Object) As IHtmlString
        If String.IsNullOrEmpty(linkText) Then
            Return MvcHtmlString.Empty
        End If
        Return html.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes)
    End Function
End Module

然后:

@Html.MyActionLink(currentItem.ContactName, "contact", "details", New With { .id = currentItem.ContactID }, Nothing)

答案 2 :(得分:0)

如果你想在MVC View中使用@ Html.ActionLink获得这种结果:

<a href="#"><i class="fa-editico"></i></a>

请参阅此示例图片并阅读以下内容:https://lh5.googleusercontent.com/-5xihbu8wIkY/VJQMq9Y6foI/AAAAAAAAAK4/LNPlbibLEPo/w506-h281/LINK.JPG

我希望这段代码示例对您有所帮助,我测试了这段代码,一切运行良好。祝你好运:)

MVC助手:

   //iElementClassName = <i> - element class 
public static MvcHtmlString ActionLinkCustom(this HtmlHelper htmlHelper, string iElementClassName, string action, string controller, object routeValues, object htmlAttributes)
{
    var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);
    //get array of HTML attributes
    var attributes = AnonymousObjectToKeyValue(htmlAttributes);
    //create <a> - Tag
    var anchor = new TagBuilder("a");
    //add <i> tag inside in "<a> <a/>" Tag
    anchor.InnerHtml = string.Format("<i class='{0}'></i>", iElementClassName);
    //Make Href attribute 
    anchor.MergeAttribute("href", urlHelper.Action(action, controller, routeValues));
    //add array of attributes
    anchor.MergeAttributes(attributes, true);

    return MvcHtmlString.Create(anchor.ToString());
}

//It helps to generate attribute's array 
private static Dictionary<string, object> AnonymousObjectToKeyValue(object anonymousObject)
{
    var dictionary = new Dictionary<string, object>();

    if (anonymousObject == null) return dictionary;

    foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(anonymousObject))
    {
        dictionary.Add(propertyDescriptor.Name, propertyDescriptor.GetValue(anonymousObject));
    }

    return dictionary;
}

MVC查看:

//When user click edit css icon, MVC Controller gets Id and we see Alert message
//fa-edit - This is a CSS class name 

@Html.ActionLinkCustom("fa-editico","ActionName", "ControllerName", new { Id = Model.Id},
            new
            {
                title = "Edit Button",
                onclick = "alert("It Works !");"
            })