小编Dan*_*zzi的帖子

注销:GET或POST?

这个问题不是关于何时一般使用GET或POST; 它是关于处理Web应用程序注销的推荐方法.我已经在一般意义上找到了关于GET和POST之间差异的大量信息,但我没有找到这个特定场景的明确答案.

作为一个实用主义者,我倾向于使用GET,因为实现它比POST更简单; 只需删除一个简单的链接就可以了.这似乎是我能想到的绝大多数网站的情况,至少从头脑中可以看出来.甚至Stack Overflow也可以使用GET进行注销.

让我犹豫不决的是(尽管很老)一些论点,即一些网络加速器/代理通过访问和检索他们在页面中找到的每个链接来预先缓存页面,因此用户在点击它们时会得到更快的响应.我不确定这是否仍然适用,但如果是这种情况,那么从理论上讲,一旦有用这种加速器的用户在登录后就会被赶出应用程序,因为她的加速器会找到并检索注销链接,即使她从未点击过它.

到目前为止我所阅读的所有内容都建议POST应该用于"破坏性操作",而不改变应用程序内部状态的操作(如查询等)应该用GET处理.基于此,这里真正的问题是:

从应用程序注销被视为破坏性操作/是否会改变应用程序的内部状态?

architecture rest post get

393
推荐指数
6
解决办法
7万
查看次数

代码优先:独立协会与外国关键协会?

每次我开始研究一个新项目时,我都会和自己进行一场心理辩论,而我正在设计我的POCO.我看过很多教程/代码示例似乎都支持外键关联:

外键关联

public class Order
{
    public int ID { get; set; }
    public int CustomerID { get; set; } // <-- Customer ID
    ...
}
Run Code Online (Sandbox Code Playgroud)

独立协会相反:

独立协会

public class Order
{
    public int ID { get; set; }
    public Customer Customer { get; set; } // <-- Customer object
    ...
}
Run Code Online (Sandbox Code Playgroud)

我以前使用过NHibernate,并且使用了独立的关联,它们不仅感觉更多OO,而且(延迟加载)的优势在于可以让我访问整个Customer对象,而不仅仅是ID.例如,这允许我检索Order实例,然后Order.Customer.FirstName无需显式地进行连接,这非常方便.

所以回顾一下,我的问题是:

  1. 使用独立关联有任何明显的缺点吗?和...
  2. 如果没有,那么使用外键关联的原因是什么?

entity-framework poco

100
推荐指数
3
解决办法
3万
查看次数

Ninject:如何使用多个类型参数绑定开放泛型?

我正在使用Ninject 2.2,我正在尝试为一个带有两个类型参数的开放泛型设置绑定.根据此答案由QES,结合正确的语法IRepository<T>Repository<T>是这样的:

Bind(typeof(IRepository<>)).To(typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)

如果IRepository仅使用一个类型参数,则上述语法可以正常工作,但如果需要更多,则会中断(给出Using the generic type 'Repository<T,U>' requires 2 type arguments编译时错误.)

我怎样才能结合IRepository<T,U>Repository<T,U>

谢谢.

c# ninject-2

24
推荐指数
1
解决办法
4377
查看次数

如何在 C# 中使用带有继承的依赖注入

介绍

大家好,我目前正在使用 C# 开发一个持久性库。在那个库中,我已经实现了存储库模式,我遇到了一个 SOLID 问题。这是我当前实现的一个简化示例,重点关注基本要素:

持久化库中包含的抽象存储库:

public abstract class Repository<T> 
{
    protected Repository(
        IServiceA serviceA,
        IServiceB serviceB) 
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

库用户创建的具体存储库:

public class FooRepository : Repository<Foo> 
{
    protected FooRepository(
        IServiceA serviceA,
        IServiceB serviceB) :
        base(serviceA, serviceB)
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

好的,使用当前代码,派生类必须知道基类的每个依赖项都可以,但是如果我向基类添加依赖项怎么办?每个派生类都会中断,因为它们需要将新的依赖项传递给基类......所以目前,我被限制永远不会改变基类构造函数,这是一个问题,因为我希望我的基类有可能发展。这个实现显然打破了开放/封闭原则,但我不知道如何在不打破 SOLID 的情况下解决这个问题......

要求

  • 该库应该易于用户使用
  • 具体的存储库应该能够通过 DI 构建
  • 应将一个或多个依赖项添加到抽象存储库中,而不会影响派生存储库
  • 应该可以像使用控制器的ASP.NET MVC 框架一样使用命名约定在 DI 容器中注册每个存储库
  • 如果他愿意,用户应该能够在他的派生存储库中添加更多依赖项

已经设想的解决方案

1. 服务聚合模式

本文之后,服务聚合器模型可以应用于这种情况,因此代码看起来像这样:

持久化库中包含的抽象存储库:

public abstract class Repository<T> 
{ …
Run Code Online (Sandbox Code Playgroud)

c# inheritance dependency-injection solid-principles

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

MVC 3中类似BeginRequest的过滤器?

我的应用程序中有一些代码,我需要在执行任何其他任务之前执行(甚至在身份验证之前).到目前为止,我一直Application_BeginRequest在我的Global.asax中使用该事件,这一切都运行良好.但是这段代码需要访问数据库,而从Global.asax执行此操作由于某种原因感觉不对.此外,我正在使用的Ninject.MVC3 nuget不会将依赖项注入我的HttpApplication ctor.

所以我决定将此代码移动到自己的全局动作过滤器中.我现在遇到的问题是无论我使用什么Order或FilterScope给出这个过滤器,我都不能先让它执行; 我的授权过滤器总是胜过它.MSDN似乎证实了这一点:

过滤顺序

过滤器按以下顺序运行:

  1. 授权过滤器
  2. 动作过滤器
  3. 响应过滤器
  4. 异常过滤器

例如,授权过滤器首先运行,异常过滤器最后运行.在每个过滤器类型中,Order值指定运行顺序.在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序.

我知道我可以使用HttpModule,但是感觉不是非常MVCish,所以我试图在走这条路线之前耗尽所有可能性,这导致了我的问题:

是否有一个BeginRequest等效的全局动作过滤器?

action-filter global-asax asp.net-mvc-3

14
推荐指数
1
解决办法
6673
查看次数

使用字符串插值,如何填充给定字符?

我知道我在这里有危险,但在 SO/Google 中找不到:

使用字符串插值,如何填充给定字符?例如:

foreach (var p in people) {
    Console.WriteLine($"{p.Name,-10}: {p.Age}");
}
Run Code Online (Sandbox Code Playgroud)

将导致(例如):

Joe       : 26
Dan       : 52
Run Code Online (Sandbox Code Playgroud)

如何通过字符串插值更改带点的空格?要得到:

Joe.......: 26
Dan.......: 52
Run Code Online (Sandbox Code Playgroud)

(我知道我可以做到p.Name.PadRight(10,'.'),但我很确定有一种方法可以使用字符串插值参数,例如填充长度)。

c# c#-6.0

9
推荐指数
1
解决办法
7011
查看次数

EditorTemplates/Object.cshtml使用EditorFor()而不是Editor()?

我正在尝试创建一个复制的通用编辑器模板Html.EditorForModel(),以便以后自定义和构建.Brad Wilson的模板非常接近,但我发现当ViewData(或ViewBag)和模型中存在相同的密钥时,它会窒息.例如,ViewBag.Title如果视图模型也具有Title属性,则会导致问题.

我在这里学到使用强类型助手(即Html.EditorFor(x => x.Title)代替Html.Editor("Title")似乎没有帮助.所以我试图修改布拉德的模板,但我碰到了一堵砖墙,因为到目前为止我没有尝试过任何工作.我无法弄清楚如何在我不知道模型类型的上下文中使用强类型帮助器,例如编辑器模板.

有没有办法像Brad那样创建一个Object模板,但是使用强类型的助手(即LabelFor,EditorFor,ValidatorMessageFor)而不是弱类型的助手(即Label,Editor,ValidatorMessage)?

谢谢.

asp.net-mvc asp.net-mvc-3

7
推荐指数
2
解决办法
2146
查看次数

EF CTP5中的modelBuilder.IncludeMetadataInDatabase在哪里?

使用CTP4,我曾经能够执行以下操作(如ptrandem所示):

modelBuilder.IncludeMetadataInDatabase = false
Run Code Online (Sandbox Code Playgroud)

使用这行代码,EF不会在我的数据库中创建EdmMetadata表,也不会跟踪模型更改.

我无法在新的CTP5中找到实现这一目标的方法,所以现在每次更改模型时,我都会得到:

自创建数据库以来,支持"MyContext"上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.

那么,是否每个人都知道CTP5中的IncludeMetadataInDatabase属性在哪里?谢谢.

entity-framework-4

6
推荐指数
1
解决办法
7755
查看次数

RadioButton不在编辑器模板中选择值

我有以下型号:

public class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望默认的性别为女性,所以我在动作中设置了:

public ActionResult Create()
{
    var model = new Person { Gender = "F" }; // default is female
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

最后,视图呈现如下所示:

@model Person

@using (Html.BeginForm())
{
    @Html.EditorForModel()
    <p><input type="submit" value="Create" /></p>
}
Run Code Online (Sandbox Code Playgroud)

这一切都按预期工作.现在,让我们说,而不是简单的文本框,我想将性别显示为一组更直观的单选按钮.所以我制作了以下模板并将其保存到Shared/EditorTemplates/Gender.cshtml:

@model string
@Html.RadioButtonFor(model => model, "F") Female
@Html.RadioButtonFor(model => model, "M") Male
Run Code Online (Sandbox Code Playgroud)

最后,我装饰了性别[UIHint("Gender")].

现在通过单选按钮正确呈现性别,这很棒,但是...

问题

女性不再预先选择作为默认值,而是最终将两个单选按钮留空.我错过了什么吗?

有趣的是,如果我RadioButtonFor从模板移动到视图(更改model => model为 …

asp.net-mvc asp.net-mvc-3

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

URL 重写和 IIS Express:有些规则有效,有些则无效

我正在使用 IIS Express 开发一个 MVC 3 应用程序,该应用程序正在 web.config 中进行一些 URL 重写。我遇到了一些奇怪的事情,其中​​一些规则运行良好,而另一些则失败。

例如这个工作:

<rule name="Remove ETag">
 <match serverVariable="RESPONSE_ETag" pattern=".+" />
 <action type="Rewrite" value="" />
</rule>
Run Code Online (Sandbox Code Playgroud)

(来源:https : //stackoverflow.com/a/8089525/88709

这个没有(Unrecognized attribute 'url'在第二行给出):

<rule name="Remove trailing slash" stopProcessing="true">
  <match url="(.*)/$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>
Run Code Online (Sandbox Code Playgroud)

(来源:http : //blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx

根据ScottGu 的Introducing IIS Express,IIS Express 启用了完整的 Web 服务器功能集——包括 SSL、URL 重写、媒体支持和所有其他 IIS …

asp.net-mvc url-rewriting iis-express

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

EF 4.1:为什么将常量转换为变量会导致额外的子查询?

今天我发现实体框架正在向它生成的 SQL 添加一个不必要的子查询。我开始挖掘我的代码,试图缩小它的来源。A(很长)一段时间后,我指出了导致它的原因。但是现在我比开始时更困惑,因为我不知道为什么会这样。

基本上我发现的是,在某些情况下,简单地将常量转换为变量可以改变实体框架生成的 SQL。我已将所有内容缩小到最低限度,并将其打包在一个小型控制台应用程序中:

using System;
using System.Data.Entity;
using System.Linq;

class Program
{
    private static readonly BlogContext _db = new BlogContext();

    static void Main(string[] args)
    {
        const string email = "foo@bar.com";

        var comments = from c in _db.Comments
                       where c.Email == email
                       select c;

        var result = (from p in _db.Posts
                      join c in comments on p.PostId equals c.PostId
                      orderby p.Title
                      select new { p.Title, c.Content });

        Console.WriteLine(result);
    }
}

public class BlogContext : DbContext
{
    public DbSet<Post> Posts …
Run Code Online (Sandbox Code Playgroud)

c# linq-to-entities entity-framework code-first entity-framework-4

4
推荐指数
2
解决办法
1139
查看次数