Если Xmlhttprequest с blob не является опцией, вы можете открыть файл в новом окне и проверить, не заселены ли элементы eny в этом теле окна с интервалом.
var form = document.getElementById("frmDownlaod");
form.setAttribute("action","downoad/url");
form.setAttribute("target","downlaod");
var exportwindow = window.open("", "downlaod", "width=800,height=600,resizable=yes");
form.submit();
var responseInterval = setInterval(function(){
var winBody = exportwindow.document.body
if(winBody.hasChildNodes()) // or 'downoad/url' === exportwindow.document.location.href
{
clearInterval(responseInterval);
// do your work
// if there is error page configured your application for failed requests, check for those dom elemets
}
}, 1000)
//Better if you specify maximun no of intervals
Основная проблема заключается в том, что вам приходится издеваться над HtmlHelper, потому что вы можете использовать методы помощника для получения маршрутов или значения или возвращая результат другого метода расширения. Класс HtmlHelper имеет довольно много свойств, и некоторые из них довольно сложные, например ViewContext или текущий контроллер.
Это сообщение от Бена Харта , в котором объясняется, как создать такой макет с помощью Moq. Может быть легко переведено в другую фальшивую среду.
Это моя версия Rhino Mocks, адаптированная к изменениям в MVC Framework. Он не полностью протестирован, но работает на меня, но не ожидайте отличных результатов:
public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData)
{
var mocks = new MockRepository();
var cc = mocks.DynamicMock<ControllerContext>(
mocks.DynamicMock<HttpContextBase>(),
new RouteData(),
mocks.DynamicMock<ControllerBase>());
var mockViewContext = mocks.DynamicMock<ViewContext>(
cc,
mocks.DynamicMock<IView>(),
viewData,
new TempDataDictionary());
var mockViewDataContainer = mocks.DynamicMock<IViewDataContainer>();
mockViewDataContainer.Expect(v => v.ViewData).Return(viewData);
return new HtmlHelper(mockViewContext, mockViewDataContainer);
}