Estoy desarrollando un ASP.NET MVC3 aplicación con la navaja de Afeitar y C#. Quería saber si hay alguna forma de «desactivar» una hipervínculo prestados con la Html.ActionLink helper sin estropear mi punto de Vista con si construcciones. Como para deshabilitar me refiero a que el vínculo se hace no se puede hacer clic, de color gris y sin el subrayado.

Para dejar las cosas claras yo por la presente adjuntar el como es código que uso actualmente para hacer el truco. En lugar de deshabilitar el hipervínculo acabo de mostrar N/a como texto sin formato.

La parte de la Vista:

 <td>@if(topic.EnableTopicDownloadLink)
    {
        @Html.ActionLink("Presentation", "Download", new { topicId = topic.TopicId })
    }
    else
    {
         @Html.Raw("N/A");
    }           
</td>

<td>@if (topic.EnableTopicWatchLink)
    {
        @Html.ActionLink("Video", "Play", new { topicId = topic.TopicId })
    }
    else
    {
        @Html.Raw("N/A");
    }     
</td>

Y el ViewModel pasa a la Vista

public class TopicDownloadViewModel
    {
        public int TopicId { get; set; }
        public string TopicName { get; set; }
        public string TopicPresenter { get; set; }
        public string TopicStartTime { get; set; }
        public string TopicEndTime { get; set; }
        public bool EnableTopicWatchLink { get; set; }
        public bool EnableTopicDownloadLink { get; set; }

        public TopicDownloadViewModel(WebinarTopic webinarTopic)
        {
            TopicId = webinarTopic.TopicId;
            TopicName = webinarTopic.TopicName;
            TopicPresenter = webinarTopic.TopicPresenter;
            TopicStartTime = String.Format("{0:t}", webinarTopic.TopicStartTime);
            TopicEndTime = String.Format("{0:t}", webinarTopic.TopicEndTime);
            EnableTopicWatchLink = (webinarTopic.TopicVideoWatchLink != null) ? true : false;
            EnableTopicDownloadLink = (webinarTopic.TopicSlidesDownloadLink != null) ? true : false;
        }
    }

Sé que hay una movilidad atributo HTML para <a> pero la única manera de habilitar el enlace es omitir el atributo y no tengo ni idea de cómo hacerlo sin el uso de jQuery. Mi intension no es para uso jquery si es factible.

Gracias

Francesco

InformationsquelleAutor CiccioMiami | 2011-06-16

4 Comentarios

  1. 4

    Yo he entendido correctamente, el problema principal es que usted no desea crear adicionales Si -s. Yo haría auxiliar personalizada en su lugar

    public static MvcHtmlString ActionLink<TModel>(this HtmlHelper<TModel> helper, string linkText, string action, object routeValues, bool disable)
        {
            if (disable)
            {
                return helper.ActionLink(linkText, action, routeValues, new { disabled = "disabled" });
            }
            return helper.ActionLink(linkText, action, routeValues);
        }

    y pasar el último valor, como se utiliza, pero en el parámetro, sin @si

        @Html.ActionLink("Presentation", "Download", topic.EnableTopicDownloadLink)

    Mi código necesita modificaciones para aceptar personalizado htmlattributes (topicId) y combinar con disabled. Para esto, se puede utilizar HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); de mezcla y de la movilidad de atributo con el valor devuelto en el cuerpo del método

    • +1, esta es la ruta que me iría bien si se tratara de mí. En vez de repetir la misma IF condición más y más me gustaría encapsular que la simple lógica en un helper personalizado.
    • dudo disabled = «disabled» trabajar para que las etiquetas de anclaje
    • sí, html estándar no contiene movilidad atributo para la etiqueta de anclaje. Pero el punto principal en mi respuesta fue donde el lugar de la costumbre reutilizables de vista de la lógica. Me mostró que el mejor lugar para hacerlo es en el interior de auxiliar personalizada. El código puede ser modificado para generar texto en lugar de anclaje cuando se desactiva
  2. 3

    yo sugeriría representación actionlink y la asignación de la clase de forma condicional. e.g

    @Html.ActionLink("Video", "Play", new { topicId = topic.TopicId },new{@class = topic.EnableTopicWatchLink?"":"dis"} )n

    a continuación, puede utilizar algo de css en gris y eliminar el subrayado

    <style type="text/css">   
     a.dis
        {
          color:gray;
          text-decoration:none;
        }
    </style>

    y para anular el comportamiento predeterminado de enlace de algunos js funcionaría

     <script type = "text/javascript">
        $('a.dis').live('click',function(){
        return false; //cancels the default operation of click function
        });
        </script>
  3. 1

    Porque MVC es apátrida, no existe el concepto de la gestión del estado como webforms. En otras palabras, usted no puede simplemente «activar» o «desactivar» un vínculo en el sentido de que estás pidiendo. Usted parece estar haciendo correctamente, aunque un poco más detallado de lo que usted necesita. Haces un post y sus métodos de acción a tomar la decisión de habilitar/deshabilitar el enlace antes de que la vista se representa, entonces su vista debe comprobar si es permitido mostrar el enlace o no. Usted podría entonces pasar a lo largo de un modelo de propiedad como esta:

    @(Model.TopicWatchLink ? Html.ActionLink("Video", "Play", new { topicId = topic.TopicId }) : "N/A")

    Que es básicamente lo que estás haciendo ya, pero colocado en una línea de SI para ocupar menos espacio.

    Otra opción que puedes considerar es @Html.RenderAction("someAction"). Esto permite llamar a un método de acción (y de paso de parámetros, si lo desea) desde su punto de vista cuando se está procesando. Entonces, usted puede poner la lógica que determina si se mostrarán o no la vista en el dicho método de acción y que la acción de devolver el enlace html. Mientras podría poner el código HTML de una cadena, te recomiendo que definir una vista parcial o utilizar el TagBuilder de la clase para construir su enlace y la devuelva. Ex:

    public MvcHtmlString GenerateLink(bool enabled)
    {
        if (enabled)
        {
            var tagBuilder = new TagBuilder("a");
            tagBuilder.MergAttribute("src", Url.Action("Video", "Play")); //Pseudo-code
            return tagBuilder.ToString(TagRenderMode.SelfClosing);
        }
        else
            return "N/A";
    }

    A continuación, en la vista:

    @Html.RenderAction("GenerateLink", new { enabled = Model.TopicWatchLink }); //Pseudo-code

    Algunos de los que es pseudo-código (es decir, no se ha probado y puede no coincidir exactamente con el código real), pero usted consigue la idea. También puedes hacer esto en un html helper.

    Ver aquí para más detalles sobre la creación de HTML ayudantes. Si fuera yo iba a usar ActionLink en un helper personalizado y sólo aceptan un valor booleano que determinar qué mostrar.

    Hay un número de diferentes opciones disponibles para usted. Sólo recuerde que MVC es apátrida y le toca a usted para hacer ese tipo de lógica de decisiones así como la implementación de ellos. Podría ser más fácil en webforms para llamar linkButton.Disabled = true; pero usted no tiene idea de lo que ASP.NET ¿para desactivarlo. Básicamente, usted no tiene control sobre cómo la desactivación ocurre y usted puede permanecer en la ignorancia a la base de HTML/CSS. MVC es trabajar íntimamente con este proceso. Podría ser más detallado que el establecimiento de disabled a la verdad, pero en mi opinión merece la pena hacerlo para ver a través de la abstracción.

  4. -1

    <%=Html.ActionLink(«Crear una nueva Página», «Nuevo», new { Controller = «TestAdmin», path = Request[«ruta»] }, new {disabled=»disabled»} ). %>

Dejar respuesta

Please enter your comment!
Please enter your name here