MVC3 में रेजर का उपयोग करके छवियों के साथ लिंक को बदलने का सबसे अच्छा तरीका क्या है। मैं फिलहाल यही कर रहा हूं:
<a href="@Url.Action("Edit", new { id=MyId })"><img src="../../Content/Images/Image.bmp", alt="Edit" /></a>
क्या कोई बेहतर तरीका है?
MVC3 में रेजर का उपयोग करके छवियों के साथ लिंक को बदलने का सबसे अच्छा तरीका क्या है। मैं फिलहाल यही कर रहा हूं:
<a href="@Url.Action("Edit", new { id=MyId })"><img src="../../Content/Images/Image.bmp", alt="Edit" /></a>
क्या कोई बेहतर तरीका है?
जवाबों:
आप अपनी CSHTML फ़ाइल में कोड को सरल बनाने के लिए HtmlHelper के लिए एक एक्सटेंशन विधि बना सकते हैं। आप अपने टैग को इस तरह से विधि से बदल सकते हैं:
// Sample usage in CSHTML
@Html.ActionImage("Edit", new { id = MyId }, "~/Content/Images/Image.bmp", "Edit")
यहाँ ऊपर दिए गए कोड के लिए एक नमूना विस्तार विधि है:
// Extension method
public static MvcHtmlString ActionImage(this HtmlHelper html, string action, object routeValues, string imagePath, string alt)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
// build the <img> tag
var imgBuilder = new TagBuilder("img");
imgBuilder.MergeAttribute("src", url.Content(imagePath));
imgBuilder.MergeAttribute("alt", alt);
string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);
// build the <a> tag
var anchorBuilder = new TagBuilder("a");
anchorBuilder.MergeAttribute("href", url.Action(action, routeValues));
anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(anchorHtml);
}
routeValues
करना है ActionResult
और इसके प्रकार में परिवर्तन करना है और फिर इसे url.Action
बदलना routeValues
हैrouteValues.GetRouteValueDictionary()
/configuration/system.web/pages/namespaces
। तत्व में।
alt
, मैं एक वस्तु को तब var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
और अंत में एक अनाम वस्तु का उपयोग करके html गुण प्राप्त करने के लिए स्वीकार करता हूंforeach (var attr in attributes){ imgBuilder.MergeAttribute(attr.Key, attr.Value.ToString());}
/Views
फ़ोल्डर
आप उपयोग कर सकते हैं Url.Content
जो सभी लिंक के लिए काम करता है क्योंकि यह ~
रूट यूरी को टिल्ड का अनुवाद करता है ।
<a href="@Url.Action("Edit", new { id=MyId })">
<img src="@Url.Content("~/Content/Images/Image.bmp")", alt="Edit" />
</a>
<a href="@Url.Action("Index","Home")"><img src="@Url.Content("~/Content/images/myimage.gif")" alt="Home" /></a>
ऊपर लुकास के उत्तर पर बिल्डिंग, यह एक अधिभार है जो एक्शनलिंक के समान एक नियंत्रक नाम पैरामीटर के रूप में लेता है। जब आपकी छवि किसी भिन्न नियंत्रक में किसी क्रिया से लिंक करती है तो इस अधिभार का उपयोग करें।
// Extension method
public static MvcHtmlString ActionImage(this HtmlHelper html, string action, string controllerName, object routeValues, string imagePath, string alt)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
// build the <img> tag
var imgBuilder = new TagBuilder("img");
imgBuilder.MergeAttribute("src", url.Content(imagePath));
imgBuilder.MergeAttribute("alt", alt);
string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);
// build the <a> tag
var anchorBuilder = new TagBuilder("a");
anchorBuilder.MergeAttribute("href", url.Action(action, controllerName, routeValues));
anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(anchorHtml);
}
ठीक है, आप @ लुकास समाधान का उपयोग कर सकते हैं, लेकिन एक और तरीका भी है।
@Html.ActionLink("Update", "Update", *Your object value*, new { @class = "imgLink"})
अब, इस क्लास को CSS फ़ाइल या अपने पेज पर जोड़ें:
.imgLink
{
background: url(YourImage.png) no-repeat;
}
उस वर्ग के साथ, किसी भी लिंक पर आपकी वांछित छवि होगी।
ControllerName
अपनी कार्रवाई करनी है । जैसे:@Html.ActionLink("Update", "Update", "*Your Controller*",*object values*, new {@class = "imgLink"})
यह एक बहुत उपयोगी धागा निकला।
जिन लोगों को घुंघराले ब्रेसिज़ से एलर्जी है, उनके लिए यहां लुकास का वीबी.नेट संस्करण 'और क्रेक के उत्तर हैं:
Public Module ActionImage
<System.Runtime.CompilerServices.Extension()>
Function ActionImage(html As HtmlHelper, Action As String, RouteValues As Object, ImagePath As String, AltText As String) As MvcHtmlString
Dim url = New UrlHelper(html.ViewContext.RequestContext)
Dim imgHtml As String
'Build the <img> tag
Dim imgBuilder = New TagBuilder("img")
With imgBuilder
.MergeAttribute("src", url.Content(ImagePath))
.MergeAttribute("alt", AltText)
imgHtml = .ToString(TagRenderMode.Normal)
End With
Dim aHtml As String
'Build the <a> tag
Dim aBuilder = New TagBuilder("a")
With aBuilder
.MergeAttribute("href", url.Action(Action, RouteValues))
.InnerHtml = imgHtml 'Include the <img> tag inside
aHtml = aBuilder.ToString(TagRenderMode.Normal)
End With
Return MvcHtmlString.Create(aHtml)
End Function
<Extension()>
Function ActionImage(html As HtmlHelper, Action As String, Controller As String, RouteValues As Object, ImagePath As String, AltText As String) As MvcHtmlString
Dim url = New UrlHelper(html.ViewContext.RequestContext)
Dim imgHtml As String
'Build the <img> tag
Dim imgBuilder = New TagBuilder("img")
With imgBuilder
.MergeAttribute("src", url.Content(ImagePath))
.MergeAttribute("alt", AltText)
imgHtml = .ToString(TagRenderMode.Normal)
End With
Dim aHtml As String
'Build the <a> tag
Dim aBuilder = New TagBuilder("a")
With aBuilder
.MergeAttribute("href", url.Action(Action, Controller, RouteValues))
.InnerHtml = imgHtml 'Include the <img> tag inside
aHtml = aBuilder.ToString(TagRenderMode.Normal)
End With
Return MvcHtmlString.Create(aHtml)
End Function
End Module
यह विस्तार विधि भी काम करती है (सार्वजनिक स्थैतिक वर्ग में रखा जाना):
public static MvcHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, string altText, string actionName, object routeValues, AjaxOptions ajaxOptions)
{
var builder = new TagBuilder("img");
builder.MergeAttribute("src", imageUrl);
builder.MergeAttribute("alt", altText);
var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions);
return new MvcHtmlString( link.ToHtmlString().Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)) );
}
ल्यूक द्वारा शुरू किए गए सभी भयानक कामों को जोड़ने के लिए मैं एक और पोस्ट कर रहा हूं जो एक सीएसएस वर्ग मूल्य लेता है और वैकल्पिक मापदंडों (ASP.NET 3.5+ के तहत मान्य) के रूप में वर्ग और कुल मिलाकर व्यवहार करता है। यह अधिक कार्यक्षमता की अनुमति देगा लेकिन अतिभारित तरीकों की संख्या को कम करना चाहिए।
// Extension method
public static MvcHtmlString ActionImage(this HtmlHelper html, string action,
string controllerName, object routeValues, string imagePath, string alt = null, string cssClass = null)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
// build the <img> tag
var imgBuilder = new TagBuilder("img");
imgBuilder.MergeAttribute("src", url.Content(imagePath));
if(alt != null)
imgBuilder.MergeAttribute("alt", alt);
if (cssClass != null)
imgBuilder.MergeAttribute("class", cssClass);
string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);
// build the <a> tag
var anchorBuilder = new TagBuilder("a");
anchorBuilder.MergeAttribute("href", url.Action(action, controllerName, routeValues));
anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(anchorHtml);
}
स्लाइड संशोधन ने हेल्पर को बदल दिया
public static IHtmlString ActionImageLink(this HtmlHelper html, string action, object routeValues, string styleClass, string alt)
{
var url = new UrlHelper(html.ViewContext.RequestContext);
var anchorBuilder = new TagBuilder("a");
anchorBuilder.MergeAttribute("href", url.Action(action, routeValues));
anchorBuilder.AddCssClass(styleClass);
string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);
return new HtmlString(anchorHtml);
}
CSS क्लास
.Edit {
background: url('../images/edit.png') no-repeat right;
display: inline-block;
height: 16px;
width: 16px;
}
लिंक बनाएं बस क्लास का नाम पास करें
@Html.ActionImageLink("Edit", new { id = item.ID }, "Edit" , "Edit")
मैं लुकास और " ASP.NET MVC हेल्पर्स, दो ऑब्जेक्ट htmlAttributes एक साथ विलय " और प्लस कंट्रोलरनाम से निम्नलिखित कोड में उत्तर मिला है:
// CSHTML में नमूना उपयोग
@Html.ActionImage("Edit",
"EditController"
new { id = MyId },
"~/Content/Images/Image.bmp",
new { width=108, height=129, alt="Edit" })
और ऊपर दिए गए कोड के लिए एक्सटेंशन क्लास:
using System.Collections.Generic;
using System.Reflection;
using System.Web.Mvc;
namespace MVC.Extensions
{
public static class MvcHtmlStringExt
{
// Extension method
public static MvcHtmlString ActionImage(
this HtmlHelper html,
string action,
string controllerName,
object routeValues,
string imagePath,
object htmlAttributes)
{
///programming/4896439/action-image-mvc3-razor
var url = new UrlHelper(html.ViewContext.RequestContext);
// build the <img> tag
var imgBuilder = new TagBuilder("img");
imgBuilder.MergeAttribute("src", url.Content(imagePath));
var dictAttributes = htmlAttributes.ToDictionary();
if (dictAttributes != null)
{
foreach (var attribute in dictAttributes)
{
imgBuilder.MergeAttribute(attribute.Key, attribute.Value.ToString(), true);
}
}
string imgHtml = imgBuilder.ToString(TagRenderMode.SelfClosing);
// build the <a> tag
var anchorBuilder = new TagBuilder("a");
anchorBuilder.MergeAttribute("href", url.Action(action, controllerName, routeValues));
anchorBuilder.InnerHtml = imgHtml; // include the <img> tag inside
string anchorHtml = anchorBuilder.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(anchorHtml);
}
public static IDictionary<string, object> ToDictionary(this object data)
{
///programming/6038255/asp-net-mvc-helpers-merging-two-object-htmlattributes-together
if (data == null) return null; // Or throw an ArgumentNullException if you want
BindingFlags publicAttributes = BindingFlags.Public | BindingFlags.Instance;
Dictionary<string, object> dictionary = new Dictionary<string, object>();
foreach (PropertyInfo property in
data.GetType().GetProperties(publicAttributes))
{
if (property.CanRead)
{
dictionary.Add(property.Name, property.GetValue(data, null));
}
}
return dictionary;
}
}
}
यह बहुत ठीक काम होगा
<a href="<%:Url.Action("Edit","Account",new { id=item.UserId }) %>"><img src="../../Content/ThemeNew/images/edit_notes_delete11.png" alt="Edit" width="25px" height="25px" /></a>
~/Content
) का उपयोग करने का भी प्रयास करें । पथ../../Content
अलग-अलग मार्गों से मान्य नहीं हो सकते (उदाहरण के लिए/
,/Home
,/Home/Index
)।