这是像这样的问题的延续.
是否有任何调整性能的指导原则?我并不是指大O的收益,只是节省一些线性时间.
例如,要花多少钱预分类保存在任SortedList或SortedDictionary?
假设我有一个有3个属性的人类排序,其中一个是年龄.我应该先按年龄换取物品吗?
我应该首先对一个属性进行排序,然后使用结果列表/字典对两个属性进行排序,依此类推?
想到的任何其他优化?
参考这个问题:
当然,很棒,但我可以吃蛋糕吗?
我正在寻找的是一种赏心悦目的方式,以一种字符可能包含的方式为一个属性提供一个替代名称.
就像是:
[BetterJsonProperty(PropertyName = "foo_bar")]
public string FooBar { get; set; }
Run Code Online (Sandbox Code Playgroud)
都
{
"FooBar": "yup"
}
Run Code Online (Sandbox Code Playgroud)
和
{
"foo_bar":"uhuh"
}
Run Code Online (Sandbox Code Playgroud)
将按预期反序列化.
由于没有属性的解决方案可以工作,或者类的属性如下:
[AllowCStylePropertyNameAlternatives]
Run Code Online (Sandbox Code Playgroud) 对于错误消息,验证错误等
ModelState.AddErrorMessage("Fool!");
Run Code Online (Sandbox Code Playgroud)
但是,你在哪里提出成功回应,例如"你成功地向你的前任转移了很多钱".+"你的余额现在为零".我仍然希望在控制器级别设置它,最好是以键值方式设置它,就像错误消息一样,但不会使模型状态失效.
这通常是怎么做的?ViewData的?
怎么了?viewmodel变量是一个值为true的bool.
<%= Html.HiddenFor(m => m.TheBool) %>
<%= Html.Hidden("IsTimeExpanded",Model.TheBool) %>
<input type="hidden" value="<%=Model.TheBool%>" name="TheBool" id="TheBool">
Run Code Online (Sandbox Code Playgroud)
结果是:
<input id="TheBool" name="TheBool" value="False" type="hidden">
<input id="TheBool" name="TheBool" value="False" type="hidden">
<input value="True" name="TheBool" id="TheBool" type="hidden">
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?为什么助手不按预期工作?
通过选择MVC来开发我们的新网站,我发现自己正处于围绕着我的"最佳实践"中进行实时开发.两周前,NerdDinner是我的向导,但随着MVC 2的发展,即使它看起来已经过时了.这是一次激动人心的经历,我很荣幸能够每天与智能程序员保持密切联系.
现在我偶然发现了一个似乎无法直接回答的问题 - 无论如何都要从所有的博客中得到答案 - 而且我想从社区中获得一些见解.这是关于编辑(阅读:编辑动作).大量的材料,教程和博客,涉及创建和查看模型.因此,尽管这个问题可能没有提出问题,但我希望能够进行一些讨论,这有助于我决定我将采取的发展道路.
我的模型代表具有多个字段的用户,如姓名,地址和电子邮件.实际上,所有名称都在字段上,每个名称都有名字,姓氏和中间名."详细信息"视图显示所有这些字段,但您一次只能更改一组字段,例如,您的名称.用户展开表单,而其他字段在上方和下方仍然可见.因此,回发的表单包含表示模型的字段的子集.
虽然这对我们和我们的布局问题很有吸引力,但由于各种原因,它会被严肃的MVC开发人员所避开.我一直在阅读一些模式和最佳实践,看起来这与viewmodel == view的范例无关.或者我弄错了?
无论如何,NerdDinner指示使用FormCollection och UpdateModel.所有空字段都被高兴地忽略了.从那以后,MVC社区已经放弃了这种方法,以至于没有发现MVC 2 中的错误.如果没有formcollection中的完整模型,UpdateModel将无法工作.
获得最多赞誉的视图模型模式似乎是包含自定义视图模型实体的专用视图模型,并且是我的设计问题可以与之兼容的唯一模型.它需要繁琐的映射,尽管使用AutoMapper和吉米博加德的想法可能会减轻这种情况,这可能是也可能不值得.他还提出了视图和视图模型之间的1:1关系.
为了与这些设计范例保持一致,我将为每个扩展字段集创建一个视图和相关视图.视图模型将各自几乎相同,仅在只读字段中不同,视图也包含多次重复标记.这对我来说似乎很荒谬.将来我可能希望能够同时显示两个,更多或所有字段集.
我会非常认真地阅读我希望引发的讨论.提前谢谢了.
我有一个用户无需登录即可发布的表单.但是,如果他的电子邮件被识别,则需要输入密码.密码表单通过Ajax验证,如果成功,则提交主表单.两种形式都需要有效的AntiForgeryToken.
问题是,密码检查作为副产品也签署了用户(来自客户的要求).这使令牌无效,并且无法发送主表单.
我已尝试以编程方式生成新令牌,但我无法让它工作.
关于如何解决这个问题的任何想法?
最终解决方案
我发现这个问题有助于输入反射.但是,这就是为什么在正常情况下你会避免黑客攻击内部类型的主要原因,这些类型是在版本之间的程序集之间进行的.正如贝蒂建议的那样,使用ILSpy来寻找东西.
这是最终的代码.
if (signIn)
FormsAuth.SignIn(user.Email, false);
var mvcAssembly = typeof(AntiForgery).Assembly;
var afdType = mvcAssembly.GetType("System.Web.Helpers.AntiForgeryData");
string fieldName = Convert.ToString(afdType.InvokeMember(
"GetAntiForgeryTokenName",
BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod,
null,
null,
new object[] { null }));
var serializerType = mvcAssembly.GetType("System.Web.Helpers.AntiForgeryDataSerializer");
var serializerCtor = serializerType.GetConstructor(new Type[0]);
object serializer = serializerCtor.Invoke(new object[0]);
string text = HttpContext.Request.Form[fieldName];
object antiForgeryData = serializerType.InvokeMember("Deserialize", BindingFlags.InvokeMethod, null, serializer, new object[] { text });
afdType.GetProperty("Username").SetValue(antiForgeryData,
signIn ? user.Email : string.Empty,
null);
string newToken = Convert.ToString(serializerType.InvokeMember(
"Serialize", …Run Code Online (Sandbox Code Playgroud) (渐近)性能之间是否存在差异?
var a = Orders.OrderBy(order => order.Date).First()
Run Code Online (Sandbox Code Playgroud)
和
var y = Orders.Where(order => order.Date == Orders.Min(x => x.Date)).ToList();
Run Code Online (Sandbox Code Playgroud)
即将First()执行OrderBy()?我猜不是.MSDN说通过foreach och GetEnumerator枚举集合,但是短语不排除其他扩展.
我越来越
System.NotSupportedException:EntitySet"Entities.Message"中的所有对象必须具有唯一的主键.但是,类型为"Model.Message"的实例和类型为"Model.Comment"的实例都具有相同的主键值
但我不知道这意味着什么.
使用EF4,我有一堆Message类型的实体.其中一些消息实际上是一个子类型,注释,按类型继承.只是
DB.Message.First();
Run Code Online (Sandbox Code Playgroud)
会产生例外.我有其他的子类型实例,我没有遇到问题,但我看不出任何差异.但是,有时候,如果我重新启动开发服务器,问题就会消失,但并非总是如此.
编辑:我已经解决了(之前应该有)问题是存储过程获取我的消息的错误.当前设置的方式是获取与Message相关的所有字段,sproc会忽略Comment表.然后上下文继续进行捣乱,可能是通过再次提取那些也是评论的消息,如您所建议的那样.如何正确地做到这一点是当前的核心问题.我在http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb0bb421-ba8e-4b35-b7a7-950901adb602找到了解决方案的一些迹象.
我需要封顶事件的数量ñ在一段时间内允许的DeltaT.我能想到的任何方法,空间都是O(m),其中m是每个deltaT发送的最大事件请求数,或者是O(deltaT/r),其中r是可接受的分辨率.
编辑:deltaT是相对于时间戳的滑动时间窗口.
例如:保留事件时间戳的循环缓冲区.事件裁剪所有早于t-deltaT的时间戳.如果时间戳数超过n,则拒绝事件.将时间戳添加到缓冲区.
或者,初始化一个大小为deltaT/r的整数的循环桶缓冲区,该时间段相对于具有分辨率r的电流的时间索引.保持指针i.在事件中,自上次事件除以r后的时间增加i.将原始i和新原始i之间的缓冲区归零.增加我.拒绝,如果bugger的总和超过n.
什么是更好的方式?
我刚刚在c#中实现了我的第二个建议,固定deltaT为1 s,固定分辨率为10 ms.
public class EventCap
{
private const int RES = 10; //resolution in ms
private int _max;
private readonly int[] _tsBuffer;
private int p = 0;
private DateTime? _lastEventTime;
private int _length = 1000 / …Run Code Online (Sandbox Code Playgroud) 获取"不允许新事务,因为会话中正在运行其他线程".
它与foreach循环或任何人通常与此消息一起出现问题无关.
我在整个请求中使用带有repositoy模式和公共上下文的EF4.有些事情发生了,无法准确确定是什么,只要我尝试使用上下文保存变更,跨请求,我就会收到此消息,并且只有在我回收应用程序池后才会消失.
我关闭连接了吗?我该怎么说?我是否为每个请求使用了新的上下文?是.
这是怎么回事?有解决方法吗?
编辑:(上下文工厂)
private static Dictionary<string, CoinEntities> _instances;
public static CoinEntities DefaultInstance
{
get
{
if (HttpContext.Current == null)
{ //todo: mock instead. testing.
if (!Instances.ContainsKey("_TEST"))
Instances["_TEST"] = new CoinEntities();
return Instances["_TEST"];
}
if (!Instances.ContainsKey("_DEFAULT"))
Instances["_DEFAULT"] = new CoinEntities();
return Instances["_DEFAULT"];
}
}
Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×4
asp.net ×2
c# ×2
.net ×1
ado.net ×1
algorithm ×1
automapper ×1
html-helper ×1
json.net ×1
linq ×1
modelstate ×1
performance ×1
sortedlist ×1
sorting ×1