小编nki*_*kes的帖子

如何以PDF格式呈现ASP.NET MVC视图

我正在使用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传递给视图......还有其他想法吗?

谢谢!

.net c# pdf asp.net-mvc pdf-generation

24
推荐指数
2
解决办法
6万
查看次数

依赖注入和类继承

我觉得这是我应该已经知道的事情,但我今天并没有解雇所有引擎......

我有一个带有单个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声明的一部分传递.

目标是满足基类的要求,而后代类不知道它的任何内容.

也许我说这一切都错了,但它让我烦恼.有没有想过更好的方法来处理这个?我觉得我必须要错过一些简单的东西......

c# dependency-injection castle-windsor

13
推荐指数
1
解决办法
9013
查看次数

使用NHibernate和Autofac管理多个数据库

当我自己找到解决方案的时候,我以为我会在那里得到这个问题.

在构建了大量应用程序之后,我有最后一分钟的要求来支持读/写一个额外的数据库(总共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)

nhibernate asp.net-mvc autofac multiple-databases

8
推荐指数
1
解决办法
3152
查看次数

无法在MVC 2 RC区域中设置默认控制器

这应该很简单,但唉......

我在我的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的区域实施感到不满,我认为我没有做任何过于复杂的事情......任何人都有同样的问题?我是否需要指定一条单独的路线,可能是在根区域,非区域级别?

asp.net-mvc routing

5
推荐指数
1
解决办法
1800
查看次数

使用jQuery进行多文件上传

我试图在表单发布之前允许多个文件上传.我想要的是用户只能看到一个文件上传元素,每次选择一个文件时,都会显示一个<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)

jquery file-upload

5
推荐指数
1
解决办法
2511
查看次数

如何使用Castle.Windsor传递带依赖注入的构造函数参数?

我正在连接我的第一个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以获取构造函数参数?

subsonic asp.net-mvc castle-windsor subsonic3

4
推荐指数
1
解决办法
1958
查看次数

使用OWIN Identity v2声明来跟踪WebAPI2应用程序中的自定义属性

让我的脑袋围绕新的身份框架,并试图找出如何最好地处理自定义用户属性.我已经尝试扩展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

4
推荐指数
1
解决办法
1969
查看次数

在嵌套的jQuery Accordion中汇总子元素

当使用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下的任何东西.

jquery jquery-ui accordion

2
推荐指数
1
解决办法
1970
查看次数

Nuget提供的最新EntityFramework版本中的CodeFirst位发生了什么变化?

沮丧:对我的软件包进行更新,其中包括EFCodeFirst.被告知软件包管理器现在已经过时了,它安装了最新版本的EntityFramework(4.1.10311.0).现在我找不到我的上下文的引用(DbContext,DbSet都被破坏了).他们去哪儿了?他们被重命名了吗?CodeFirst的内容发生了什么变化?

entity-framework nuget asp.net-mvc-3

0
推荐指数
1
解决办法
220
查看次数