我正在使用ExpertPDF的Html-to-PDF转换实用程序来解决这个问题(尽管如果有足够的文档,我会对其他库开放).
简而言之,我有一个以特定方式格式化的视图,我想将其呈现为用户可以保存到磁盘的PDF文档.
我到目前为止是一个PrintService(它实现了一个IPrintService接口),这个实现有两个PrintToPDF()重载,一个只接受一个URL,另一个接受一个HTML字符串,两者都返回一个byte [].我只计算了需要HTML字符串的第二个重载的细节.
我想从我的控制器做的事情是这样的:
public FileStreamResult Print(int id)
{
var model = _CustomRepository.Get(id);
string renderedView = SomethingThatRendersMyViewAsAString(model);
Stream byteStream = _PrintService.PrintToPdf(renderedView);
HttpContext.Response.AddHeader("content-disposition",
"attachment; filename=report.pdf");
return new FileStreamResult(byteStream, "application/pdf");
}
Run Code Online (Sandbox Code Playgroud)
这在理论上会将PDF呈现给页面.这是我正在寻求帮助的"SomethingThatRendersMyViewAsAString".有没有快速的方法来获取视图的字符串表示?或许我应该坚持使用URL重载并将URL传递给视图......还有其他想法吗?
谢谢!
我觉得这是我应该已经知道的事情,但我今天并没有解雇所有引擎......
我有一个带有单个ctor的基类,它接受一个接口的实现,因为它是唯一的参数.我正在使用DI框架,并且我的组件注册都已设置好并且工作正常.
当我从这个基类继承时,除非我将值传递给基础构造函数,否则我必须定义一个无参数的ctor,它会绕过DI.
所以现在我有:
public class MyObjectBase
{
IMyRequiredInterface _InterfaceImpl;
public MyObjectBase(IMyRequiredInterface interfaceImpl)
{
_InterfaceImpl = interfaceImpl;
}
...
}
public class AnotherObject : MyObjectBase
{
public AnotherObject()
{
}
...
}
Run Code Online (Sandbox Code Playgroud)
所以,走出大门就失败了.当实例化AnotherObject时,我收到错误,表明没有基类ctor接受0参数.好的,我明白了.但现在我可以选择:修改后代类ctor以获取类似参数并将该值传递给基本ctor,或者连接基类中的ctor链,这会强制我绕过DI并创建具体实现必需的接口并将其作为无参数ctor声明的一部分传递.
目标是满足基类的要求,而后代类不知道它的任何内容.
也许我说这一切都错了,但它让我烦恼.有没有想过更好的方法来处理这个?我觉得我必须要错过一些简单的东西......
当我自己找到解决方案的时候,我以为我会在那里得到这个问题.
在构建了大量应用程序之后,我有最后一分钟的要求来支持读/写一个额外的数据库(总共2个,没有已知的其他数据库).我使用NHibernate构建了应用程序,Autofac提供了DI/IoC组件.FWIW,它驻留在ASP.NET MVC 2应用程序中.
我有一个通用的存储库类,它采用NHibernate会话.理论上,我可以继续使用这个通用存储库(IRepository<>)为第二个数据库,只要传递给它的会话是从适当的SessionFactory生成的,对吧?
好吧,当应用程序启动时,Autofac会做到这一点.关于Session和SessionFactory,我有一个模块说明:
builder.Register(c => c.Resolve<ISessionFactory>().OpenSession())
.InstancePerMatchingLifetimeScope(WebLifetime.Request)
.OnActivated(e =>
{
e.Context.Resolve<TransactionManager>().CurrentTransaction = ((ISession)e.Instance).BeginTransaction();
});
builder.Register(c => ConfigureNHibernate())
.SingleInstance();
Run Code Online (Sandbox Code Playgroud)
返回基本SessionFactory的ConfigureNHibernate()看起来像:
private ISessionFactory ConfigureNHibernate()
{
Configuration cfg = new Configuration().Configure();
cfg.AddAssembly(typeof(Entity).Assembly);
return cfg.Configure().BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
目前,这仅限于一个数据库.在任何其他NHib场景中,我可能会将单独的SessionFactories的实例推送到哈希中,并根据需要检索它们.我不想重新设计整个事情,因为我们非常接近主要版本.所以,我猜我至少需要修改上面的方法,以便我可以独立配置两个SessionFactories.我的灰色区域是如何指定正确的工厂与特定存储库一起使用(或至少对于特定于第二个数据库的实体).
任何人都有使用IoC容器和NHibernate这种方式的经验吗?
编辑 我已经删除了一个GetSessionFactory方法,它接受一个配置文件路径,检查HttpRuntime.Cache中匹配的SessionFactory的存在,创建一个新实例(如果还没有),并返回该SessionFactory.现在我仍然需要知道如何告诉Autofac如何以及何时指定适当的配置路径.新方法看起来像(比利2006年后大量举债这里):
private ISessionFactory GetSessionFactory(string sessionFactoryConfigPath)
{
Configuration cfg = null;
var sessionFactory = (ISessionFactory)HttpRuntime.Cache.Get(sessionFactoryConfigPath);
if (sessionFactory == null)
{
if (!File.Exists(sessionFactoryConfigPath))
throw new FileNotFoundException("The nhibernate configuration file at '" + sessionFactoryConfigPath + "' could not be found.");
cfg …Run Code Online (Sandbox Code Playgroud) 这应该很简单,但唉......
我在我的MVC 2项目(单个项目区域)内设置了一个管理区域.我已经创建了几个控制器及其各自的视图文件夹.在AreaRegistration.RegisterArea方法中,我已指定我希望默认控制器为"Dashboard":
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Dashboard", action = "Index", id = "" }, new string[] { "Admin" }
);
}
Run Code Online (Sandbox Code Playgroud)
如果我导航到url/Admin/Dashboard,索引就会好起来.但是,我想要的是允许用户转到url/Admin /并查看相同的内容.但是,当我这样做时,我得到"无法找到资源".
我只是对MVC 2的区域实施感到不满,我认为我没有做任何过于复杂的事情......任何人都有同样的问题?我是否需要指定一条单独的路线,可能是在根区域,非区域级别?
我试图在表单发布之前允许多个文件上传.我想要的是用户只能看到一个文件上传元素,每次选择一个文件时,都会显示一个<li>包含文件名的新文件和一个图像/链接,用于从集合中删除该特定文件.有一个jQuery MultiFile插件可以满足我的需求,但我不能让自定义样式以我想要的方式工作,所以我自己动手.
到目前为止,我有以下代码.它成功添加<li>,使用新选择的文件隐藏文件上传元素,并将空文件上传元素附加到页面以供用户选择新文件.我正在努力适当地管理元素的删除,虽然它并不那么困难,但我一直盯着这一点,现在只是觉得我做错了.我希望其他人可能有一些见解,提示要清理它(即使它更优雅),等等.代码如下.
HTML:
<div id="product-image-area" class="group" style="border-bottom: none; padding-top: 0">
<ul id="photos" class="nobull">
<li id="no-product-images-msg" class="" >
<%= Html.Image("no-photos.png") %>
</li>
</ul>
</div>
<div id="upload-area">
<h4 class="st">Upload an image</h4>
<p class="note">Allowed file types are .gif, .jpg, .jpeg, and .png</p>
<p id="file-input" class="st sb"><input class="photo-upload" id="VenuePhotos_0" name="VenuePhotos[]" type="file" /></p>
</div>
Run Code Online (Sandbox Code Playgroud)
脚本:
$(function () {
$('.photo-upload').live('change', function () {
var fileCount = new Number($(this).parent().children('.photo-upload').length);
$('#photos').append('<li id="venue_photo_' + (fileCount - 1) + '">' + $(this).val() + '<img title="' …Run Code Online (Sandbox Code Playgroud) 我正在连接我的第一个SubSonic 3应用程序(在ASP.NET MVC 1.0前端),我正在看Rob的SimpleRepository.我正在使用Castle.Windsor作为注入框架.
在我的应用程序启动中,我将Castle配置为将SubSonic SimpleRepository绑定到SubSonic IRepository.没有什么复杂的.但是,SimpleRepository有一个ctor重载,它带有两个值:连接字符串名称和一组SimpleRepositoryOptions.过去没有深入挖掘Castle,不清楚是否有办法通过配置(或其他方法)指定ctor参数.
现在,我有一个SimpleRepository的自定义实现,它在它的无参数ctor中显式创建了一个带有这些参数的SimpleRepository,但是如果我想在任何时候更改它们,它需要更改代码并重新编译.
是否有一种更优雅的方式来配置Castle以获取构造函数参数?
让我的脑袋围绕新的身份框架,并试图找出如何最好地处理自定义用户属性.我已经尝试扩展IdentityUser,它可以存储信息,但到目前为止需要额外的db调用来恢复属性.我期待切换到使用声明来存储/检索此信息.
首先,我想要存储/检索的特定道具对于单个用户(多对一)不是唯一的.考虑将用户组合在一个自定义组结构中.我想存储GroupId以用于其他相关实体.
我能够存储GroupId(目前使用ClaimTypes.NameIdentifier,我不认为它是该类型的正确用法,但是......).但是,当我去检索该值时,声明集合中找不到声明类型.它在数据库中,所以我知道它就在那里.我错过了什么.
FWIW:由于它是WebAPI,我没有使用传统的登录.我正在使用令牌身份验证.
当我创建用户时,我有类似的东西:
public async Task<IdentityResult> CreateUserAsync(string email, string password, string groupId)
{
var userId = ObjectId.GenerateNewId(DateTime.UtcNow).ToString(); // yes, it's a NoSQL store
var user = new ApplicationUser
{
Id = userId,
UserName = email
};
var claim = new IdentityUserClaim { ClaimType = ClaimTypes.NameIdentifier, ClaimValue = groupId, UserId = userId, Id = ObjectId.GenerateNewId(DateTime.UtcNow).ToString() };
user.Claims.Add(claim);
var result = await _UserManager.CreateAsync(user, password);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这会创建一个看起来合适的数据库条目.
当我检索该值时,我得到空引用错误.这是通过扩展方法的代码:
public static string GetGroupId(this IIdentity identity)
{
var claimsIdentity = identity …Run Code Online (Sandbox Code Playgroud) c# membership claims-based-identity asp.net-identity asp.net-web-api2
当使用jQuery的Accordion(以嵌套方式)时,我想确保在单击/打开父元素时,关闭/汇总任何打开的子元素.我不确定在尝试这样做时我应该使用哪个选择器.到目前为止,我已经尝试将"激活"设置为false来修改一个更改事件,但这只会使任何打开的元素自动关闭.
假设我只有1个嵌套手风琴,我的jquery初始化看起来像:
$(".accordion").accordion({
active: false, collapsible: true, autoHeight: false, animated: 'swing'
});
$(".child-accordion").accordion({
active: false, collapsible: true, autoHeight: false, animated: 'swing',
change: function(event, ui) { $(".child-accordion").accordion("activate", false); }
});
Run Code Online (Sandbox Code Playgroud)
其中.child-accordion是嵌套实例.当.accordion的成员被打开时,我需要关闭.child-accordion下的任何东西.
沮丧:对我的软件包进行更新,其中包括EFCodeFirst.被告知软件包管理器现在已经过时了,它安装了最新版本的EntityFramework(4.1.10311.0).现在我找不到我的上下文的引用(DbContext,DbSet都被破坏了).他们去哪儿了?他们被重命名了吗?CodeFirst的内容发生了什么变化?
asp.net-mvc ×4
c# ×3
jquery ×2
.net ×1
accordion ×1
autofac ×1
file-upload ×1
jquery-ui ×1
membership ×1
nhibernate ×1
nuget ×1
pdf ×1
routing ×1
subsonic ×1
subsonic3 ×1