这个问题不是关于何时一般使用GET或POST; 它是关于处理Web应用程序注销的推荐方法.我已经在一般意义上找到了关于GET和POST之间差异的大量信息,但我没有找到这个特定场景的明确答案.
作为一个实用主义者,我倾向于使用GET,因为实现它比POST更简单; 只需删除一个简单的链接就可以了.这似乎是我能想到的绝大多数网站的情况,至少从头脑中可以看出来.甚至Stack Overflow也可以使用GET进行注销.
让我犹豫不决的是(尽管很老)一些论点,即一些网络加速器/代理通过访问和检索他们在页面中找到的每个链接来预先缓存页面,因此用户在点击它们时会得到更快的响应.我不确定这是否仍然适用,但如果是这种情况,那么从理论上讲,一旦有用这种加速器的用户在登录后就会被赶出应用程序,因为她的加速器会找到并检索注销链接,即使她从未点击过它.
到目前为止我所阅读的所有内容都建议POST应该用于"破坏性操作",而不改变应用程序内部状态的操作(如查询等)应该用GET处理.基于此,这里真正的问题是:
从应用程序注销被视为破坏性操作/是否会改变应用程序的内部状态?
每次我开始研究一个新项目时,我都会和自己进行一场心理辩论,而我正在设计我的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无需显式地进行连接,这非常方便.
所以回顾一下,我的问题是:
我正在使用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# 开发一个持久性库。在那个库中,我已经实现了存储库模式,我遇到了一个 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 的情况下解决这个问题......
在本文之后,服务聚合器模型可以应用于这种情况,因此代码看起来像这样:
持久化库中包含的抽象存储库:
public abstract class Repository<T>
{ …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一些代码,我需要在执行任何其他任务之前执行(甚至在身份验证之前).到目前为止,我一直Application_BeginRequest在我的Global.asax中使用该事件,这一切都运行良好.但是这段代码需要访问数据库,而从Global.asax执行此操作由于某种原因感觉不对.此外,我正在使用的Ninject.MVC3 nuget不会将依赖项注入我的HttpApplication ctor.
所以我决定将此代码移动到自己的全局动作过滤器中.我现在遇到的问题是无论我使用什么Order或FilterScope给出这个过滤器,我都不能先让它执行; 我的授权过滤器总是胜过它.MSDN似乎证实了这一点:
过滤顺序
过滤器按以下顺序运行:
- 授权过滤器
- 动作过滤器
- 响应过滤器
- 异常过滤器
例如,授权过滤器首先运行,异常过滤器最后运行.在每个过滤器类型中,Order值指定运行顺序.在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序.
我知道我可以使用HttpModule,但是感觉不是非常MVCish,所以我试图在走这条路线之前耗尽所有可能性,这导致了我的问题:
是否有一个BeginRequest等效的全局动作过滤器?
我知道我在这里有危险,但在 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,'.'),但我很确定有一种方法可以使用字符串插值参数,例如填充长度)。
我正在尝试创建一个复制的通用编辑器模板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)?
谢谢.
使用CTP4,我曾经能够执行以下操作(如ptrandem所示):
modelBuilder.IncludeMetadataInDatabase = false
Run Code Online (Sandbox Code Playgroud)
使用这行代码,EF不会在我的数据库中创建EdmMetadata表,也不会跟踪模型更改.
我无法在新的CTP5中找到实现这一目标的方法,所以现在每次更改模型时,我都会得到:
自创建数据库以来,支持"MyContext"上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.
那么,是否每个人都知道CTP5中的IncludeMetadataInDatabase属性在哪里?谢谢.
我有以下型号:
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为 …
我正在使用 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 …
今天我发现实体框架正在向它生成的 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
c# ×4
asp.net-mvc ×3
architecture ×1
c#-6.0 ×1
code-first ×1
get ×1
global-asax ×1
iis-express ×1
inheritance ×1
ninject-2 ×1
poco ×1
post ×1
rest ×1