私は(現時点で)いくつかの単純な検索基準に基づいてユーザーリストを返すWebAPIを持っています。
public class UserListAPIController : APIController
{
public List<UserManagerSearchResult> Get(int siteGroupId)
{
return userService.UserManagerSearch(LoggedInUserToken.DefaultSiteID, siteGroupId);
}
}
これは、選択されたさまざまなフィルター基準に基づいて動的に生成されたURLを使用してajax getJsonリクエストを使用して、クライアントのknockoutjsビューモデルから呼び出されます。
self.LoadUsers = function () {
var SiteGroupID = self.selectedSiteGroup();
$.getJSON("/API/UserListAPI/?siteGroupId=" + SiteGroupID
, function (allData) {
var mappedUsers = $.map(allData, function (item) {
//mapping code
return dbu;
});
self.Users(mappedUsers);
});
};
次に、ノックアウトテンプレートバインディングを使用して、結果をグリッドに適切に表示します。
また、UI検索リストで選択したものとまったく同じ結果を返す「csvにダウンロード」機能を実装する必要があります。
したがって、私のアイデアは、同じWeb APIを実行できるが、json応答ではなくcsv応答を返すカスタムmediatypeformatterを実装することでした。
私はこれをフィドラーで実装してテストし、期待どおりに機能しています。したがって、タイプを「text / csv」に設定し、Web APIを呼び出すと、csvの結果が得られます。
public class UserManagerSearchResultCSVFormatter : BufferedMediaTypeFormatter
{
public UserManagerSearchResultCSVFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
}
public override bool CanReadType(Type type)
{
return false;
}
public override bool CanWriteType(Type type)
{
if (type == typeof(UserManagerSearchResult))
{
return true;
}
else
{
Type enumerableType = typeof(List<UserManagerSearchResult>);
return enumerableType.IsAssignableFrom(type);
}
}
public override void WriteToStream(Type type, object value, Stream writeStream,
System.Net.Http.HttpContent content)
{
using (var writer = new StreamWriter(writeStream))
{
var results = value as List<UserManagerSearchResult>;
if (results != null)
{
foreach (var result in results)
{
WriteItem(result, writer);
}
}
else
{
var result = value as UserManagerSearchResult;
if (result == null)
{
throw new InvalidOperationException("Cannot serialize type");
}
WriteItem(result, writer);
}
}
writeStream.Close();
}
// Helper methods for serializing Products to CSV format.
private void WriteItem(UserManagerSearchResult result, StreamWriter writer)
{
writer.WriteLine("{0},{1},{2}", Escape(result.UserId),
Escape(result.UserName), Escape(result.Year));
}
static char[] _specialChars = new char[] { ',', '\n', '\r', '"' };
private string Escape(object o)
{
if (o == null)
{
return "";
}
string field = o.ToString();
if (field.IndexOfAny(_specialChars) != -1)
{
return String.Format("\"{0}\"", field.Replace("\"", "\"\""));
}
else return field;
}
}
それがすべての背景です。
実装するのに最適な方法がわからないいくつかの問題が発生しました。
まず、これが機能するためには、次のことができる必要があります。1. URLを動的に構築する(上記のajax getjsonの例で見られるように)2。リクエストのタイプを「text/csv」に設定します3.inititeリクエストタイプを使用したURLの呼び出しで、ファイルのダウンロードを強制します。
これは、これを実装するための最良の方法として私が立ち往生していたのとほぼ同じです。私はこれを達成するためにいくつかのjqueryajaxを検討してきましたが、それほど遠くはなく、これを実装するための最良の方法について誰かの意見を取り入れることができました。