我正在使用AcceptVerbs
Scott Gu的Preview 5博客文章中详述的方法来处理ASP.NET MVC中的表单条目:
所以我没有必要使用TempData
.也就是说,我现在必须在此过程中添加一个"确认"步骤,似乎需要使用TempData
.
出于某种原因,我厌恶使用TempData
- 它是一种可以设计的东西.
这是一个有效的问题,还是我在弥补?
我有一个类型:
public class IssueForm
{
Order Order {get; set;}
Item Item {get; set;}
Range Range {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
由于Order和Item的要求,我创建了一个自定义模型绑定器,但Range仍然可以使用Default Model Binder.
我的自定义模型绑定器中是否有一种方法可以调用默认模型绑定器来返回Range对象?我想我只需要正确设置ModelBindingContext,但我不知道如何.
编辑
查看第一个评论和答案 - 似乎从默认模型绑定器继承可能很有用.
到目前为止为我的设置添加更多细节我有:
public IssueFormModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Order = //code to pull the OrderNumber from the context and create an Order
Item = //code to pull the ItemNumber from the context and create an Item
IssueForm form = IssueFormFactory.Create(Order, Item);
form.Range = // ** I'd like to replace …
Run Code Online (Sandbox Code Playgroud) 我有一个触发DOM事件的手表:
scope.$watch(function() { return controller.selected; }, function(selected) {
if (selected) {
$input.trigger('focus');
}
});
Run Code Online (Sandbox Code Playgroud)
问题是我在'焦点'上有一个处理程序scope.$apply
.
$input.bind('focus', function() {
scope.$apply(function() { controller.focused = true; });
});
Run Code Online (Sandbox Code Playgroud)
因此当我$watch
从内部触发$digest
它时会导致错误,因为它试图触发另一个错误$digest
.
我的解决方法是将触发器放入$timeout
.
scope.$watch(function() { return controller.selected; }, function(selected) {
if (selected) {
$timeout(function() { $input.trigger('focus'); });
}
});
Run Code Online (Sandbox Code Playgroud)
这工作......到目前为止.这是处理这个问题的正确方法吗?我不确定这是否能抓住每一个案例,并且想知道是否有一个有角度的批准方式让一段代码推迟到摘要之后.
谢谢!
目前我有一个ActionFilter,它从HttpContext获取当前用户名,并将其传递给在服务方法上使用它的操作.例如:
Service.DoSomething(userName);
Run Code Online (Sandbox Code Playgroud)
我现在有理由不在动作级别而是在控制器构造级别执行此操作.目前我正在使用结构图来创建控制器并注入服务.我正在寻找类似的东西:
public interface IUserProvider
{
string UserName { get; }
}
public class HttpContextUserProvider : IUserProvider
{
private HttpContext context;
public HttpContextUserProvider(HttpContext context)
{
this.context = context;
}
public string UserName
{
get
{
return context.User.Identity.Name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我的IoC foo非常弱,因为这是我用过的第一个项目.
所以我的问题是......如何告诉结构图在HttpContextUserProvider的构造函数中传递HttpContext?这看起来很奇怪......我不知道怎么想HttpContext.
是否存在EF需要新数据提供程序且无法使用ODBC的特定原因?我认为它必须是一些ORM特定的问题,但NHibernate通过ODBC工作正常.
我正在使用NHibernate并且可以继续使用Nhibernate,但我担心我不能在这里为任何未来的程序员假设Nhibernate知识.
所以我已经完成了一些单元测试,并且有编写测试的经验,但我还没有完全接受TDD作为设计工具.
我目前的项目是重新使用现有系统,该系统生成序列号作为公司装配过程的一部分.由于查看现有系统,我了解当前的流程和工作流程.我还有一个新要求列表以及它们将如何修改工作流程.
我觉得我已经准备好开始编写程序了,我决定强迫自己最终从头到尾做TDD.
但现在我不知道从哪里开始.(我也想知道我是否因为已经知道用户的程序流程而欺骗TDD流程.)
用户流程实际上是串行的,只是一系列步骤.举个例子,第一步是:
当用户选择其中一个部件号时,下一步开始.
所以我想我可以用这第一步作为起点.我知道我需要一段代码来获取制造订单号并返回零件号列表.
// This isn't what I'd want my code to end up looking like
// but it is the simplest statement of what I want
IList<string> partNumbers = GetPartNumbersForMfgOrder(string mfgOrder);
Run Code Online (Sandbox Code Playgroud)
阅读Kent Becks的示例书,他谈到了选择小测试.这看起来像一个非常大的黑盒子.它将需要一个mfg订单存储库,我必须抓取产品结构树以查找此mfg订单的所有适用的部件号,我甚至根本没有在代码中定义我的域模型.
所以一方面看起来像一个糟糕的开始 - 一个非常普遍的高级功能.另一方面,我觉得如果我从较低的水平开始,我真的只是猜测我可能需要什么,这似乎是反TDD.
作为旁注......这就是你如何使用故事?
作为汇编程序,我想获得一个mfg订单上的部件号列表,以便我可以选择要序列化的部件号
说实话,汇编人永远不会这么说.所有汇编程序想要的是完成对mfg命令的操作:
作为汇编程序,我想用序列号标记部件,以便我可以完成对mfg订单的操作
我有一个ASP.NET MVC应用程序使用控制器和操作上的授权属性.这一直运作良好,但出现了新的皱纹.
对象:装运
角色:航运,会计,一般用户
装运在工作流程中移动.在状态A中,它只能由Shipping进行编辑.在状态B中,它只能通过会计编辑.
我有一个ShipmentController和一个Edit Action.我可以使用Authorization属性将Edit操作限制为仅限于这两个角色,但这并不区分Shipment所处的状态.我需要在服务调用之前在操作内部执行一些授权以确定用户是否真的有权执行编辑操作.
所以我有两个问题:
1)在Action中获得授权的好方法.Controller Action调用服务,然后服务对Shipment对象进行适当的调用(更新数量,更新日期等).我确信我希望Shipment对象不受任何授权要求的影响.另一方面,如果我希望服务对象知道授权,我没有真正掌握.这有什么好的模式吗?
2)我的问题实际上是设计糟糕的症状吗?我应该有一个StateAShipmentController和StateBShipmentController而不是ShipmentController吗?我没有在Shipment对象中内置任何多态性(状态只是一个枚举),但也许我应该,也许控制器应该反映出来.
我想我会采用更一般的解决方案,而不是针对我的情况.我只想提供一个例子来说明这个问题.
谢谢!
model-view-controller asp.net-mvc authorization design-patterns single-responsibility-principle
我在VB.NET中遇到Nullable DateTime问题(VS 2010).
方法1
If String.IsNullOrEmpty(LastCalibrationDateTextBox.Text) Then
gauge.LastCalibrationDate = Nothing
Else
gauge.LastCalibrationDate = DateTime.Parse(LastCalibrationDateTextBox.Text)
End If
Run Code Online (Sandbox Code Playgroud)
方法2
gauge.LastCalibrationDate = If(String.IsNullOrEmpty(LastCalibrationDateTextBox.Text), Nothing, DateTime.Parse(LastCalibrationDateTextBox.Text))
Run Code Online (Sandbox Code Playgroud)
给定空字符串时,方法1将一个Null(Nothing)值分配给gauge.LastCalibrationDate,但方法2将其赋予DateTime.MinValue.
在我的代码的其他地方我有:
LastCalibrationDate = If(IsDBNull(dr("LastCalibrationDate")), Nothing, dr("LastCalibrationDate"))
Run Code Online (Sandbox Code Playgroud)
这正确地将Null(Nothing)从三元运算符赋予Nullable DateTime.
我错过了什么?谢谢!
是否可以在SQL Server 2005中的CLR触发器上通过MSMQ向队列发送消息?
我正在使用SQL Server Project类型,但System.Messaging不会显示为我可以添加的引用.
基本上,当一行写入表时,我需要进行某种类型的操作(打印).生成该行的设备是一个只能执行基本操作的手持扫描程序 - 其中一个是通过odbc写入SQL服务器.最初的想法是只是轮询表,抓取记录,打印记录,删除记录.这可能会很好,但它似乎是一个很好的案例和借口来了解消息队列.
对不起那个模糊的标题:)
我是宏的新手,我很难理解这两个陈述之间的区别:
`(+ 1 2 ~(+ 2 3)) ; => (clojure.core/+ 1 2 5)
'(+ 1 2 ~(+ 2 3)) ; => (+ 1 2 (clojure.core/unquote (+ 2 3)))
Run Code Online (Sandbox Code Playgroud)
当我在没有取消引用的情况下运行它们时,除了排位赛之外,它们似乎相同吗?
`(+ 1 2 (+ 2 3)) ; => (clojure.core/+ 1 2 (clojure.core/+ 2 3))
'(+ 1 2 (+ 2 3)) ; => (+ 1 2 (+ 2 3))
Run Code Online (Sandbox Code Playgroud)
所以基本上我对'vs'感到困惑.我的理解是他们都引用了列表中的所有内容,这就是为什么我不确定为什么unquoting行为不同.基本上``的行为方式与我期望的'和'表现一样.
谢谢!
asp.net-mvc ×4
ado.net ×1
agile ×1
angularjs ×1
c# ×1
clojure ×1
datetime ×1
httpcontext ×1
lisp ×1
macros ×1
modelbinders ×1
msmq ×1
nhibernate ×1
nullable ×1
single-responsibility-principle ×1
sql-server ×1
structuremap ×1
tdd ×1
tempdata ×1
vb.net ×1