Czy istnieje sposób, aby parametry tej metody rozszerzenia "intellisensible" z mojego widoku?Metoda rozszerzenia LINQ pomoc szukana II
W tej chwili mogę uzyskać podpowiedź dotyczącą tego, jakie parametry (w metodzie działania kontrolera) są, ale z pewnością chcielibyśmy, aby IntelliSense wpisał nazwy parametrów dla "bezpieczeństwa". W każdym razie, bez zbędnych ceregieli, metody, a następnie wykorzystania:
public static string Script<T>(this HtmlHelper html,
Expression<Action<T>> action) where T:Controller
{
var call = action.Body as MethodCallExpression;
if (call != null)
{
// paramDic - to be used later for routevalues
var paramDic = new Dictionary<string, object>();
string actionName = call.Method.Name;
var methodParams = call.Method.GetParameters();
if (methodParams.Any())
{
for (int index = 0; index < methodParams.Length; index++)
{
ParameterInfo parameterInfo = methodParams[index];
Expression expression = call.Arguments[index];
object objValue;
var expressionConst = expression as ConstantExpression;
if(expressionConst!=null)
{
objValue = expressionConst.Value;
}
else
{
Expression<Func<object>> expressionConstOther =
Expression.Lambda<Func<object>>(
Expression.Convert(expression, typeof(object)),
new ParameterExpression[0]);
objValue = expressionConstOther.Compile()();
}
paramDic.Add(parameterInfo.Name, objValue);
}
}
string controllerName = typeof(T).Name;
if (controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
{
controllerName = controllerName.Remove(controllerName.Length - 10, 10);
}
var routeValues = new RouteValueDictionary(paramDic);
var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
var url = urlHelper.Action(actionName, controllerName, routeValues);
const string linkFormat = "<script type=\"text/javascript\" src=\"{0}\"></script>";
string link = string.Format(linkFormat, url);
return link;
}
return null;
}
użytkowania (gdzie FundShareholderController
jest mój kontroler i x.JsFile()
jest nim sposób działania.):
<%=Html.Script<FundShareholderController>(x => x.JsFile("CreateInvestorBookingJsFile", 0))%>
Mam nadzieję, że to ma sens . Daj mi znać, jeśli brakuje jakichkolwiek szczegółów, które musisz wesprzeć.
BTW - wszelkie wskazówki optymalizacyjne są chętnie przyjmowane również na pokładzie.
ja nie rozumiem z Twojej przykład jakie parametry Chcesz intellisensed, i gdzie wartości pochodzą? – Iain
hi iain - parametry pochodzą z ogólnej akcji Expression>. tzn. mogę "wskazać" działanie o nazwie GetStuff (int id, nazwa ciągu), a intellisense powinno włączyć te nazwy parametrów. Właściwie, od napisania tego, udało mi się sprawić, że działa, więc w pewnym momencie zaktualizuje ten przykład. –