दिलचस्प प्रश्न (+1)। मुझे लगता है कि उद्देश्य क्वेरीस्ट्रिंग पैरामीटर को अपने Action
पैरामीटर में बाध्य करने के लिए डिफ़ॉल्ट मॉडल बाइंडर का उपयोग करना है।
बॉक्स में से मुझे विश्वास नहीं है कि ActionLink
विधि आपके लिए यह करेगी (बेशक आपके पास खुद को रोल करने से रोक नहीं है)। परावर्तक में देखकर हम देख सकते हैं कि object
RouteValueDictionary
में जोड़ा गया है, केवल महत्वपूर्ण मान जोड़े जोड़े गए हैं। यह वह कोड है जो कुंजी मान जोड़े जोड़ता है और जैसा कि आप देख सकते हैं कि ऑब्जेक्ट गुणों का कोई ट्रैवर्स नहीं है।
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values))
{
object obj2 = descriptor.GetValue(values);
this.Add(descriptor.Name, obj2);
}
अपने वस्तु
var values = new { Filter = new Filter { MessageFilter = item.Message } }
कुंजी जोड़ा जा रहा है Filter
है और मूल्य अपने Filter
वस्तु जो अपने ऑब्जेक्ट प्रकार के पूरी तरह से योग्य नाम के मूल्यांकन करेंगे है के लिए
तो।
इसका परिणाम Filter=Youre.Namespace.Filter
है।
संपादितसंभव अपने सटीक आवश्यकताओं के आधार पर
एक्सटेंशन विधिसमाधान करता है काम
ध्यान दें कि यह स्थिर ढांचे तरीकों का उपयोग करता ExpressionHelper
और ModelMetadata
(जो मौजूदा सहायकों द्वारा भी उपयोग किया जाता है) उचित नाम निर्धारित करने के लिए डिफ़ॉल्ट मॉडल बाइंडर क्रमशः संपत्ति का समझ और मूल्य समझ जाएगा।
public static class ExtentionMethods
{
public static MvcHtmlString ActionLink<TModel, TProperty>(
this HtmlHelper<TModel> helper,
string linkText,
string actionName,
string controllerName,
params Expression<Func<TModel, TProperty>>[] expressions)
{
var urlHelper = new UrlHelper(helper.ViewContext.HttpContext.Request.RequestContext);
var url = urlHelper.Action(actionName, controllerName);
if (expressions.Any())
{
url += "?";
foreach (var expression in expressions)
{
var result = ExpressionHelper.GetExpressionText(expression);
var metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, helper.ViewData);
url = string.Concat(url, result, "=", metadata.SimpleDisplayText, "&");
}
url = url.TrimEnd('&');
}
return new MvcHtmlString(string.Format("<a href='{0}'>{1}</a>", url, linkText));
}
}
नमूना मॉडल
public class MyViewModel
{
public string SomeProperty { get; set; }
public FilterViewModel Filter { get; set; }
}
public class FilterViewModel
{
public string MessageFilter { get; set; }
}
कार्रवाई
public ActionResult YourAction(MyViewModel model)
{
return this.View(
new MyViewModel
{
SomeProperty = "property value",
Filter = new FilterViewModel
{
MessageFilter = "stuff"
}
});
}
प्रयोग
विधि के उस अंतिम params
पैरामीटर के माध्यम से क्वेरी दृश्य में आपकी दृश्य मॉडल गुणों में से कोई भी जोड़ा जा सकता है।
@this.Html.ActionLink(
"Your Link Text",
"YourAction",
"YourController",
x => x.SomeProperty,
x => x.Filter.MessageFilter)
मार्कअप
<a href='/YourAction/YourController?SomeProperty=some property value&Filter.MessageFilter=stuff'>Your Link Text</a>
इसके बजाय string.Format
का उपयोग कर आप TagBuilder
इस्तेमाल कर सकते हैं की , क्वेरी स्ट्रिंग सुरक्षित रूप से एक यूआरएल में पारित होने के लिए इनकोडिंग किया जाना चाहिए और इस विस्तार विधि कुछ अतिरिक्त सत्यापन की आवश्यकता होगी, लेकिन मुझे लगता है कि यह उपयोगी हो सकता है। ध्यान दें कि, हालांकि यह एक्सटेंशन विधि एमवीसी 4 के लिए बनाई गई है, लेकिन इसे पिछले संस्करणों के लिए आसानी से संशोधित किया जा सकता है। मुझे एहसास नहीं हुआ कि एमवीसी टैग में से एक अब तक संस्करण 3 के लिए था।
+1 एक अच्छा सवाल –
संपादन के लिए धन्यवाद; मैंने जवाब का दोबारा जवाब दिया और प्रतिस्थापन में 'उपसर्ग' को जोड़ना भूल गया! –
@AndrasZoltan कोई समस्या नहीं है। – DaveShaw