我使用强类型视图,其中所有ViewModel都继承了一个类BaseViewModel.
在装饰所有控制器的ActionFilter中,我想使用Model.
现在我只能像这样访问它:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
ViewModelBase model = (ViewModelBase)filterContext.ActionParameters["viewModel"];
base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)
问题是,我必须知道密钥"viewModel".关键是viewModel,因为在我的控制器中我用过:
返回视图("MyView",viewModel)
是否有更安全的方式来访问模型?
我的网站允许匿名用户.我看到,在负载过重的情况下,匿名用户有时会获得其他用户的个人资料值.
我首先删除我的cookie并在cookie值中获得有效的唯一值.ASPXANONYMOUS.在几个请求之后,我得到了另一个用户已经使用的.ASPXANONYMOUS的新值.我在loggs中看到,总有几个用户在.ASPXANONYMOUS中共享相同的值.
我可以在我的日志中看到2个或更多用户真正获得.ASPXANONYMOUS相同的cookie值,即使他们有不同的IP.
这是htttp流量.在第二个图像中显示更改cookie(您必须显示图像的完整大小才能读取日志):
其中一项工作正常:
替代文字http://img413.imageshack.us/img413/2711/log1.gif
然后有一个请求更改cookie 替换文本http://img704.imageshack.us/img704/8175/log2.gif
然后使用新的cookie
alt text http://img704.imageshack.us/img704/3818/log3.gif
为了安全起见,我删除了依赖注入.我不使用OutputCaching.
我的web.config具有以下身份验证设置:
<anonymousIdentification enabled="true" cookieless="UseCookies" cookieName=".ASPXANONYMOUS"
cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" />
<authentication mode="Forms">
<forms loginUrl="~/de/Account/Login" />
</authentication>
Run Code Online (Sandbox Code Playgroud)
有没有人知道我还能记录什么或者我应该看看什么?
UPDATE
我现在看到我展示的http流量完全有效..ASPXANONYMOUS中的值发生变化是因为cookie被刷新.该值包含AnonymousID和时间戳.
这不会导致用户在正常情况下具有相同的.ASPXANONYMOUS值.
问题是,无论何时从AnonymousIdentificationModule设置cokies,那么有可能有几个用户获得此cookie.在我的应用程序中设置cookie并没有这个奇怪的副作用.
asp.net asp.net-mvc forms-authentication anonymousidentification
ActionFilter我的控制器级有一个.OnActionExecuting在Web应用程序中调用控制器的操作时,将调用该方法.
现在我Action在一个UnitTest中调用:
NiceController niceController = new NiceController();
ActionResult result = niceController.WhateverAction();
Run Code Online (Sandbox Code Playgroud)
有没有办法让ActionFilter调用?
我有一个部分用于几个视图.部分包含表格.表单提交时的操作总是相同,但包含操作的控制器取决于视图.
假设我有控制器,每个控制器都有一个动作ActOnChoosenPerson:
FireStaffController
HireStaffController
我偏爱
PersonList.ascx
表单呈现为
Html.BeginForm("FireStaffController","ActOnChoosenPerson")或
Html.BeginForm("HireStaffController","ActOnChoosenPerson")
什么是摆脱控制器参数的好方法?现在我将当前控制器的名称传递给模型并使用
Html.BeginForm(Model.CurrentController,"ActOnChoosenPerson")
但这有点尴尬.
去年他们有http://channel9.msdn.com/pdc2008/但我没看到http://channel9.msdn.com/pdc2009/.他们计划今年发布视频吗?
编辑:
在发布分组会议的大约24小时内,他们将在http://microsoftpdc.com上发布会话中的媒体
EDIT1:还没有太多改变,但他们有链接到网站http://microsoftpdc.com/Videos上的视频
EDIT2:
周末得救了.视频在线访问http://microsoftpdc.com/Videos.我喜欢这个小提琴表演.
我尝试执行以下操作:
分离数据库
将文件复制到临时文件夹
再次附加数据库
这是第一次工作,但是当我尝试从同一个进程第二次运行此方法时,我得到一个错误.我总是可以访问从其他客户端再次附加的数据库,但不能从我的应用程序中访问.
错误是:
"尝试将请求发送到服务器时传输级别错误.(提供程序:共享内存提供程序,错误:0 - 管道另一端没有进程.)",当我尝试从sys.database_files读取数据时新附加的数据库.
该错误是从德语"FehleraufÜbertragungsebenebeimSenden der Anforderung an den Server"翻译而来的.
它发生在"cmdGetDBFileName.ExecuteReader"之后.我仍然可以打开连接,但查询sys.database_files failes.
源代码很长,但我想你可以在开始时跳过这部分,我将db的文件名分离.你看到我的错误或有任何想法我可以检查吗?
public bool DetachB2CPrepare()
{
_log.Debug("DetachB2CPrepare");
SqlConnection prepareDBConnection = null;
SqlConnection prepareMasterDBConnection = null;
SqlDataReader readerDbFiles = null;
bool result = true;
try
{
//rc_b2c_product_prepare.mdf
string prepareDBPysicalFileName = "";
//rc_b2c_product_prepare
string prepareDBFileName = "";
//D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\rc_b2c_product_prepare.mdf
string prepareDBFileNameComplete = "";
//rc_b2c_product_prepare_1.ldf
string prepareTransactionLogPhysicalFileName = "";
//rc_b2c_product_prepare_log
string prepareTransactionLogFileName = "";
//D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\rc_b2c_product_prepare_1.ldf
string prepareTransactionLogFileNameComplete = "";
_log.DebugFormat("Try to open …Run Code Online (Sandbox Code Playgroud) 我不是网络管理员,我是IIS的新手.所以,我正在寻求建议.
我的MVC应用程序(例如fooapp)是我网站的默认应用程序(例如foo.bar).我使用IIS管理器将站点添加到IIS7.当我导入应用程序时,IIS管理器希望将它放在它自己的目录(/ foo)中,并告诉我不应该将它放在基本(站点)目录中.这意味着要进入我的默认MVC视图,我必须输入URL http://foo.bar/fooapp/.不用说,我想通过它到达那里http://foo.bar/
我看到两种可能的解决方案
我的IIS7知识有限.我玩过一些选项(比如HTTP Redirect).由于没有任何改变,我显然不明白我在做什么.
无论如何,如果有一些被认为是"最佳实践"和/或其他建议,请告诉我.
我继承了看起来像这样的代码:
存储过程UpdateSomeStuff
Update Table1 Set Col1=Para@1
IF @@Error > 0 Goto ERR
Update Table2 Set Col1=Para@2
IF @@Error > 0 Goto ERR
RETURN 0
ERR:
return -1;
Run Code Online (Sandbox Code Playgroud)
这个sp由ADO.NET在c#中调用,就像这样
try
{
myCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
_log.Error(ex);
throw();
}
finally
{
if(myConnection!=null)
{
myConnection.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
我只是问自己:部分是IF @@错误> 0转到ERR有什么好处?如果发生错误,则无论如何都会返回sp,并且会在调用方法中捕获异常.
调用代码不处理返回值0和-1.我的计划是删除存储过程中的所有错误处理,并获得相同的结果.我是对的还是我错过了什么?
我刚刚将我的项目从ASP.NET MVC1.0升级到ASP.NET MVC4.0
令我真正害怕的一件事就是MVC3.0升级文档中的以下句子
在以前版本的ASP.NET MVC中,除少数情况外,每个请求都会创建操作过滤器.这种行为从来都不是保证行为,而只是一个实现细节,而过滤器的合同是将它们视为无状态.在ASP.NET MVC 3中,过滤器被更积极地缓存.因此,任何不正确地存储实例状态的自定义操作过滤器都可能被破坏.
我认为没有简单的方法来测试由不正确存储的实例状态引起的错误.如果我有一个问题,我非常有信心,我只能在生产中找到它.
不正确存储的实例状态真正意味着什么?
我有这个代码:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
ProductModel productModel = new ProductModel()
filterContext.ActionParameters["model"] = productModel;
}
Run Code Online (Sandbox Code Playgroud)
这是不正确存储的实例状态的示例吗?
我找到了硒测试的东西,但我没有看到手动浏览的东西。看起来总是使用格林威治标准时间。
我正在寻找一种使用特定时区测试我的本地站点的方法。为机器设置时区也会更改我的本地网络服务器(Windows 上的 iis)的时区,这不是我想要的。
我知道我可以为 firefox 设置时间偏移,但这也不是我的首选方式,因为它确实设置了偏移,而不是夏令时具有不同行为的时区。
asp.net-mvc ×6
ado.net ×2
c# ×2
asp.net ×1
browserstack ×1
date ×1
deployment ×1
iis-7 ×1
msdeploy ×1
t-sql ×1
unit-testing ×1
video ×1