링크를 올바르게 변환하는 글을 쓸 수 있었다.
개요는 다음과 같습니다 (예 : M CREF에있는 문자열 사이에 새로운 게으른 IDictionary 맵핑을 작성 도움말 컨트롤러의 생성자에서
: Api.Method.Description (선택 System.String를) 및 관련 ApiDescription
. 페이지를 다시 다양한 모델이 게으른이 (당신이 여분의 모델을 만들어야 할 수도 있습니다)
_methodReferences = new Lazy<IDictionary<string, ApiDescription>>(() => {
var dictionary = new Dictionary<string, ApiDescription>();
var apiExplorer = new ApiExplorer(config);
foreach (var apiDescription in apiExplorer.ApiDescriptions)
{
var descriptor = apiDescription.ActionDescriptor as ReflectedHttpActionDescriptor;
if (descriptor != null)
{
var methodName = string.Format(
@"M:{0}.{1}({2})",
descriptor.MethodInfo.DeclaringType.FullName,
descriptor.MethodInfo.Name,
string.Join(@",",descriptor.GetParameters().Select(x => x.ParameterType.FullName))
);
dictionary[methodName] = apiDescription;
}
}
return dictionary;
});
패스 다음 코드로 모든 기본 클래스를 준 :
public abstract class HelpPageModelBase
{
private static Regex _seeRegex = new Regex("<see cref=\"([^\"]+)\" />");
private readonly Lazy<IDictionary<string, ApiDescription>> _methodReferences;
protected HelpPageModelBase(Lazy<IDictionary<string, ApiDescription>> methodReferences)
{
_methodReferences = methodReferences;
}
protected HelpPageModelBase(HelpPageModelBase parent)
{
_methodReferences = parent._methodReferences;
}
public string ParseDoc(string documentation, UrlHelper url)
{
if (documentation == null)
{
return null;
}
return _seeRegex.Replace(documentation,
match => {
if (_methodReferences.Value.ContainsKey(match.Groups[1].Value))
{
var descriptor = _methodReferences.Value[match.Groups[1].Value];
return string.Format(@"<a href='{0}'>{1} {2}</a>",
url.Action("Api",
"Help",
new {
apiId = descriptor.GetFriendlyId()
}),
descriptor.HttpMethod.Method,
descriptor.RelativePath
);
}
return "";
});
}
}
이미
Web Api Help Page- don't escape html in xml documentation을 따라 한 경우 또는
Html.Raw(api.Documentation)
- - 어느 곳
api.Documentation.Trim()
있던 뷰에서
지금 포장은 그래서 당신은 다양한 ModelDescriptions이 HelpPageModelBase에서 상속해야이 작업을 수행하는 것을 발견 할 것이다
@Html.Raw(Model.ParseDoc(api.Documentation, Url))
된다 - 그들에게 부모 API 모델을 넘겨 주지만 (또는 더 쉬운 경우라면 Lazy) 결국 작동합니다.
저는이 솔루션에 만족하지 않습니다. 기본 Http Configuration을 사용하여 Lazy를 생성하는 정적 인 ParseDoc 메서드를 사용하는 것이 더 쉬울 수도 있습니다 (그러나 필자가 만든 다른 확장 기능으로 인해 제 경우에는 작동하지 않습니다). 더 좋은 방법이 있다면 공유하십시오! 잘하면 그것은 당신에게 출발점을 제공합니다.