VB.Net, MVC3 и Razor - изменение помощника ActionLink - PullRequest
1 голос
/ 21 июня 2011

Вопрос: Как мне изменить или создать свой собственный помощник Html.ActionLink для принятия и обработки первого параметра (linkText), переданного как пустая строка / ничего?

Подробности: В настоящее время у меня есть строго типизированное представление, которое прошло модель, которая содержит результаты поиска. Мой просмотр просматривает каждый элемент в модели и пытается отобразить ссылку на контакт со следующим кодом:

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

Обычно это будет работать нормально, но не у каждого элемента в результатах поиска есть ContactName. Помощник Html.ActionLink выдает ошибки, если этот первый параметр пуст. В случае, если это поможет, вот свойство модели для ContactName (которое генерируется из шаблона из-за Database First, поэтому я не верю, что его можно изменить):

Public Property ContactName As String

Мне бы хотелось иметь вспомогательную функцию, которая просто ничего не возвращает, если ContactName является пустой строкой / ничем.

Я предполагаю, что мне нужно расширить этот помощник, и я изо всех сил пытался найти какие-либо хорошие, современные ресурсы на VB.net для расширения функций помощника. Другие подходы более чем приветствуются, если они считаются лучшей практикой. Я работаю в VB.net, MVC3 и Razor в рамках ASP.net 4.0. Заранее спасибо за помощь!

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Чтобы это произошло, я создал папку Helpers в своем решении и добавил новый модуль HtmlHelperExtensions.vb, который подробно описан здесь (спасибо Дарину Димитрову за код модуля):

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

Затем мне нужно было зайти в мой файл Web.Config, расположенный в папке View моего решения, чтобы добавить его в качестве общего пространства имен view, добавленного как namespace = "solutionname.namespace" (обратите внимание на последний тег add 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 голос
/ 21 июня 2011
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)
0 голосов
/ 19 декабря 2014

Если вы хотите получить такой результат в MVC View, используя @ Html.ActionLink:

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

См. Этот пример изображения и читайте ниже: https://lh5.googleusercontent.com/-5xihbu8wIkY/VJQMq9Y6foI/AAAAAAAAAK4/LNPlbibLEPo/w506-h281/LINK.JPG

Надеюсь, этот пример кода вам поможет, я тестирую этот код, и все работает хорошо. удачи :) 1009 *

MVC Helper:

   //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 View:

//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 !");"
            })
...