我使用大量共享代码,有时我需要尝试扩展功能而不改变现有的解决方案.我采用了一种模式(或者它是一种反模式?),它允许添加一些"小部件",但它不能完全用于验证.
脚本
我有一个现有的共享控制器,视图模型,验证器(流畅的验证)和视图.我想在视图中添加一个文本框,从用户的角度看它似乎是共享页面的一部分,而不更改任何共享代码.我可以实现我想要的,除了在添加的文本框上进行验证.
解
我为我的小部件创建了一个控制器,视图模型,验证器和部分视图.然后我在共享视图中使用类似强类型的RenderAction:
@{ Html.RenderAction<MyWidgetController>(x => x.Execute()); }
Run Code Online (Sandbox Code Playgroud)
小部件代码
查看模型
[Validator(typeof(WidgetValidator))]
public class Widget
{
public int? WidgetTest{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
小部件验证器
public class TestValidator : AbstractValidator<WidgetViewModel>
{
public TestValidator()
{
RuleFor(x => x.WidgetTest).GreaterThan(-1).WithValidationResource("Widget_Error");
}
}
Run Code Online (Sandbox Code Playgroud)
小部件控制器
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Execute()
{
return PartialView("_widget", model);
}
[AcceptVerbs(HttpVerbs.Post)]
[ChildActionOnly]
public ActionResult Execute(WidgetViewModel model)
{
return PartialView("_widget", model);
}
Run Code Online (Sandbox Code Playgroud)
部分视图位于表单标记内,并且只有在共享模型也有效的情况下才会执行服务器端验证.
否则,该页面将被视为有效并将继续,大概是因为共享页面有效,因此重定向.
无论如何,我可以将此窗口小部件作为其添加到的页面的一部分进行验证,而无需更改共享控制器或视图模型中的代码吗?
或者,这只是一个坏主意,是否有更好的方法来实现扩展?
提前致谢
我需要views\something在MVC 4.0中检索文件夹内的单个视图的名称(来自请求)并且我不确定如何最好地执行它.
我的代码有效,但它有一种'hacky'的感觉,我希望有人可以简化.
我的代码看起来像:
private FileInfo GetNameOfViewToServe()
{
var LeftPartOfUri = Request.Url.GetLeftPart(UriPartial.Authority);
var folder = Request.Url.AbsoluteUri.Replace(LeftPartOfFolderUri,string.Empty);
var directory = new DirectoryInfo(Server.MapPath(@"~\Views\" + folder));
return directory.GetFiles().First();
}
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来实现这一目标?
我使用管理门户上载证书将.pfx安装到我的Azure网站.
我现在正尝试使用以下代码访问它们:
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certificateStore.Open(OpenFlags.ReadOnly);
var certificates = certificateStore.Certificates;
StringBuilder sb = new StringBuilder();
foreach (var certificate in certificates)
{
sb.AppendLine(certificate.Subject);
}
Run Code Online (Sandbox Code Playgroud)
发布到Azure时,会列出一堆证书,但不会列出我上传的证书.
列出的证书在这里:
CN=WW.azurewebsites.windows.net, OU=CIS(RD), O=Microsoft
CN=FullOSTransport
CN=client.geo.to.stamp.azurewebsites.windows.net
CN=ma.waws-prod-am2-005.azurewebsites.windows.net, OU=OrganizationName, O=Microsoft,
L=Redmond, S=WA, C=US
CN=FullOSTransport
CN=FullOSTransport
Run Code Online (Sandbox Code Playgroud)
我从Verisign购买了证书,它似乎已正确上传,并且显示在浏览器的"HTTPS"栏中(在Chrome中).
任何帮助都会非常感激,因为我在这里不知所措.
更新
看起来我们需要转换为Cloud Service才能使上述代码正常工作.但我可以按照此处的建议将证书添加到我的app_data文件夹吗?
http://blog.tylerdoerksen.ca/2015/11/29/pfx-certificate-files-and-azure-web-apps/
这似乎适用于Azure-Websites而不使用Web角色.
谢谢
这个问题更多的是针对良好的设计实践,而不是异常和堆栈.我很抱歉一开始并不清楚.
我希望在C#中为我的类提供自己的例外.在Java中,以下概念是完全合法的,因此如果您有一些堆栈的具体实现,您可以实现一致的错误处理(或任何其他类型的类)
public interface IStack
{
bool IsEmpty();
int Pop();
void Push(int element);
int Size { get; set; }
int Top();
public class EmptyException : Exception
{
}
public class SomeOtherClass
{
}
}
Run Code Online (Sandbox Code Playgroud)
当然,在C#中我得到一个错误,说"接口不能声明类型"
确保只实现我的接口的具体类可以访问EmptyException等的最佳方法是什么?
谢谢
我有以下代码$.getJSON在存储库中使用,以返回一些数据,然后由其他函数使用.
$.when(
repository.getUserDetails().done(dataPrimer.getUserDetails),
$.Deferred(
function (deferred) {
deferred.resolve();
}
)
).done(
function () {
repository.getUserPolicyTitles().done(dataPrimer.getUserPolicyTitles);
},
function () {
repository.getUserPage().done();
}
);
Run Code Online (Sandbox Code Playgroud)
这有效,但我需要从以下位置返回一个值:repository.getUserDetails().done(dataPrimer.getUserDetails)
可以用作参数:repository.getUserPage().done();
getUserDetails的dataPrimer模块目前如下所示:
var getUserDetails = function (jsonString) {
var object = parser.parse(jsonString);
userDetails.userName = object.user.userName;
userDetails.lastPolicyWorkedOn = object.user.lastPolicyWorkedOn;
return userDetails.lastPolicyWorkedOn;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了一些事情,比如.pipe()没有快乐,并且想要确信我正在使用一个体面的方法,所以我正在寻找"最佳实践"的方式来返回参数并在repository.getUserPage()函数中使用它吗?
我在Visual Studio 2010中的MVC4 Web API应用程序中使用XDocument,并且不确定测试策略.
我的大多数单元测试都使用内存中的XDocument,它适用于控制器,服务和存储库测试.
但是,我有XDocument.Load(filename)和XDocument.Save(filename)场景,我想测试(使用单元测试或集成测试).
我一直在寻找以下问题\回答关于所以在这里,但我不知道如何着手.
public class PathProvider
{
public virtual string GetPath()
{
return HttpContext.Current.Server.MapPath("App_Data/policies.xml")
}
}
PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
Run Code Online (Sandbox Code Playgroud)
所以,我得到了我现在可以模拟调用XDocument.Load(pathProvider.GetPath())的任何调用.
我应该尝试测试PathProvider的工作原理吗?如果,那么,我将如何处理这个问题?
谢谢
戴维
我很欣赏这里有很多实体框架测试问题.但是,我遇到了Effort,它允许内存版本的数据库上下文.我想我在这方面有几个问题:
使用这种方法的利弊是什么?
我认为EF和内存数据库使用存储库和工作单元模式,这是否意味着我们在使用这种方法时没有实现自己的?
还有其他选项,比如提供假的IDBSet,使用SQL CE或实现存储库和工作单元模式,我是否更好地使用这些技术之一?
我觉得这里选择的数量有点不知所措.我意识到可能没有银弹,但我希望得到一些指导.
谢谢
我遇到过其他开发人员编写的一些单元测试,这些测试经常使用Assert.AreEqual像这样的重载版本:
Assert.AreEqual(stringparamX, stringParamY, true, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
stringParamX在单元测试中设置,并且stringparamY将是被测系统的结果.
可能会将此代码移植到其他国家/地区,并且可以执行这些测试.但是,在查看MSDN文档文档时,我不禁想到传入CultureInfo.InvariantCulture这里会增加一些不必要的复杂性.如果在其他文化中执行,我不确定它会对测试产生什么样的影响.
在我的情况下,在单元测试的上下文中,我为什么要(或不)写这样的断言?
我正在尝试在JavaScript中使用Object.Create.我目前有以下代码:
var vehicle = {
getModel: function () {
console.log( "The model of this vehicle is.." + this.model );
}
};
var car = Object.create(vehicle, {
"id": {
value: 9,
},
"model": {
value: "Ford",
}
});
var van = Object.create(vehicle, {
"id": {
value: 10,
},
"model": {
value: "Big Van",
enumerable: true
},
"make": {
value: "Warrior",
},
"getMake": function () {
console.log( "The make of this vehicle is.." + this.make );
}
});
Run Code Online (Sandbox Code Playgroud)
我试图为getMake添加一个函数,但是我得到了错误:
TypeError:当我调用时,对象#的属性'getMake'不是函数:
van.getMake();
这可能吗?你怎么做呢?
我试图用来sinon.js创建一个间谍jQuery.append功能.
我试过:var spy = sinon.spy($, "append");并得到以下错误: TypeError: Attempted to wrap undefined property append as function.
然后我修改为:var spy = sinon.spy($.fn, "append");看起来更好,但是spy.called错误.
c# ×5
javascript ×3
jquery ×2
testing ×2
unit-testing ×2
asp.net ×1
asp.net-mvc ×1
cultureinfo ×1
directory ×1
interface ×1
linq-to-xml ×1
mappath ×1
mocking ×1
oop ×1
sinon ×1
tdd ×1