小编dav*_*avy的帖子

C#界面太僵硬了

我正在使用一些遗留代码并拥有此现有界面:

public interface IProcess
{
    IDTO Process(IDTO request);
}
Run Code Online (Sandbox Code Playgroud)

然后有一个工厂有一个巨大的switch语句返回实现接口的对象(其中17个).创建的对象然后调用进程,如:

return xProcess.Process(requestDTO);
Run Code Online (Sandbox Code Playgroud)

我的问题是我现在需要更改其中的一些以传递第二个参数,如:

xProcess.Process(requestDTO, Id);
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种优雅的方式来实现这一目标.

我试过让接口成为一个抽象类,如:

public abstract class IProcess
{

    public virtual IDTO Process(IDTO request)
    {
       return null;
    }

    public virtual IDTO Process(IDTO request, int Id)
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许我在创建的类中重写Process方法,但是我有一个问题,即IProcess由另一个接口继承,现在显然已经破坏了.

传统平台非常庞大,测试覆盖率也不高,所以我正在寻找一个优秀的解决方案,对代码库的其余部分影响最小.也许,有一种我忽略的模式?

有人可以帮忙吗?(例子很棒)

谢谢

大卫

c# oop design-patterns interface

3
推荐指数
1
解决办法
142
查看次数

按顺序加载JavaScript脚本

我正在以异步方式使用JavaScript $ ajax加载一些脚本.我需要它们以某种顺序加载,但此刻它是随机的.

我的代码是:

loadScripts();

function loadScripts() {
    getBootStrapperScript(function (callback) {            
      alert('bootStrapper loaded');
    })

    getXMLScript(function (callback) {       
        alert('xml script loaded');
    });

    getFormScript(function (callback) {       
        alert('form script loaded');
    });       
}

function getBootStrapperScript(callback) {
    $.ajax({
        url: "http://localhost/eSales/scripts/bootStrapper.js",
        dataType: "script"
    }).done(callback); 
}

function getXMLScript(callback) {
    $.ajax({
        url: "http://localhost/eSales/scripts/LoadXML.js",
        dataType: "script"
    }).done(callback);
}

function getFormScript(callback) {
    $.ajax({
        url: "http://localhost/eSales/scripts/LoadForm.js",
        dataType: "script"  
    }).done(callback);
}
Run Code Online (Sandbox Code Playgroud)

你可以看到它在这个jsFIddle中运行

有没有一种优雅的方法可以确保脚本按照定义的顺序加载?

javascript ajax jquery

3
推荐指数
1
解决办法
1941
查看次数

MVC 4 Ajax.BeginForm POST不绑定到conroller中的模型

对不起这里的代码量,但这是解释发生的事情的最佳方式.

我在MVC 4局部视图中给出了这段代码:

  <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
  @using (Ajax.BeginForm("TestPost", new AjaxOptions { HttpMethod = "Post" }))
    {                               
        foreach (var d in Model.DataItemsWithLabels)
        {                                    
            @Html.LabelFor(m => d.DataName)
            @Html.TextBoxFor(m => d.DataValue);             
        }

        <input type="submit" value="Save" />
    }
Run Code Online (Sandbox Code Playgroud)

我的控制器动作如下:

 public ActionResult TestPost(CmaPartialModel model)
 {         
        return PartialView("Transaction", model);
 }
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我有一些代码填充了一个对象列表(只有它们是空的),定义为:

 public List<DataItemWithLabel> DataItemsWithLabels { get; set; }      

    public class DataItemWithLabel
    {
        public string DisplayName { get; set; }

        public string DataName { get; set; }

        [Required]
        public string DataValue { get; set; }
    }  
Run Code Online (Sandbox Code Playgroud)

我还有什么认为正确的web.config条目:

我在这里和其他地方阅读过大量帖子但没有成功. …

ajax asp.net-mvc asp.net-ajax asp.net-mvc-4

3
推荐指数
1
解决办法
3万
查看次数

Type <T>的类型<T>,类型为<T>的可空值

我需要创建一个可以保存以下类型值的类: int?, decimal?, date, bool? string.

我希望能够这样做:

var x = new MyClass<int?>()  
x.Value = null;
x.value = 99;         

// or

var y = new MyClass<bool?>();
y.Value = null;
y.Value = true

// and so on
Run Code Online (Sandbox Code Playgroud)

我一直试图创建一个类型为T的类:

public class TestClass<T>
{             
    public T? Value{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想使用Value来获取任何允许的类型,但我不能使T为空.错误是:

只有非可空值类型才能成为Sysytem.Nullable的基础

无论如何都在做我想要实现的目标?

c# generics nullable

2
推荐指数
2
解决办法
2849
查看次数

根据运行时变量的类型创建通用类

是否可以T根据运行时变量的类型创建类的实例?

例如:

var myType = myVariable.GetType();
var myTestClass = new TestClass<myType>(); 
Run Code Online (Sandbox Code Playgroud)

这不会编译,但希望显示我想要实现的目标.

有办法吗?

编辑

说这个类是这样的:

public class TestClass<T>
{     
    public string StringValue
    {
        get
        {
            return this.TypeValue == null ? string.Empty : this.TypeValue.ToString();
        }   
    }

    public T TypeValue { get; set; }  
}
Run Code Online (Sandbox Code Playgroud)

如果我做了类似的事情:

var test1 = TestClass((dynamic)x); // x is an int

我可以设置像 test1.TypedValue = 10

如果我做了类似的事情:

var test2 = TestClass((dynamic)y); // y is a bool

我可以设置像 test2.TypedValue = true

目前我收到错误说明

不能隐式地将类型int转换为TestClass(或bool转换为TesClass)

c# generics

1
推荐指数
1
解决办法
136
查看次数

添加到可观察数组时,Knockout模板不会更新列表

我有一个淘汰模板:

<script type="text/javascript" id="myList">        
  // template stuff here                   
</script>
Run Code Online (Sandbox Code Playgroud)

我用foreach选项调用它:

<div data-bind="template: { name:'myList', foreach: ItemList }"></div>
Run Code Online (Sandbox Code Playgroud)

我从我的控制器获取视图模型并使用以下Javascript来绑定它:

var viewModel = ko.mapping.fromJS(@Html.Raw(JsonConvert.SerializeObject(Model));                                        
ko.applyBindings(viewModel, document.getElementById("contentsDetails"));
Run Code Online (Sandbox Code Playgroud)

我从我的控制器返回一些项目,一切都很好.

我的问题是,如果我添加到我的可观察数组

var itemToAdd = {
            Name:  ko.observable("name a"),
            Desc:  ko.observable("desc a")
 }

 viewModel.MyObservableArray().push(itemToAdd);
Run Code Online (Sandbox Code Playgroud)

我已经使用以下方法检查了数组是否可观察:

 console.log(ko.isObservable(viewModel.MyObservableArray));
Run Code Online (Sandbox Code Playgroud)

它不会通过将新项添加到列表来更新UI模板.

我在这做错了什么?

javascript asp.net-mvc knockout.js

1
推荐指数
1
解决办法
719
查看次数

使用ajax加载.js文件跨域

我正在尝试使用ajax访问跨域.js文件:

$.ajax({
    type:'get',
    crossDomain:true,
    url: "http://localhost/62588/scripts/bootStrapper.js",
    contentType: "application/json",
    dataType: 'jsonp'    
}).done(callback);
Run Code Online (Sandbox Code Playgroud)

我现在有一个回调:

getBootStrapperScript(function (callback) {         
       //do somethibg
})
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

XMLHttpRequest cannot load http://localhost/62588/scripts/bootStrapper.js. Origin http://localhost:62607 is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)

我一直在阅读有关JSONP但我不确定如何使用它从anoather域加载.js文件.

如果我更改上面的代码使用'jsonp'作为数据类型,但我得到这个错误:

GET http://localhost/62588/scripts/bootStrapper.js?callback=jQuery18206067646441515535_1354459693160&_=1354459696966 404 (Not Found) 
Run Code Online (Sandbox Code Playgroud)

如何加载跨域js文件?

javascript jquery

0
推荐指数
1
解决办法
7342
查看次数

这是正确使用$.在这种情况下推迟?

我有以下代码和一个模块

var def = $.Deferred();

$.getJSON("http://localhost:62588/api/Values/getXMLData")
 .done(function(json){
      def.resolve($.parseJSON(json));
});

return def;
Run Code Online (Sandbox Code Playgroud)

然后,我必须从另一个模块调用它,以便在调用处理返回的数据之前完成.

repository.getUserPolicies().done(function (userPolicies) {
    process(userPolicies);
});
Run Code Online (Sandbox Code Playgroud)

这很好用但我还不太明白延迟对象是如何工作的.

我已经读过你可以使用getJSON的延迟对象,但不确定这是否正是我在这里做的?

我想知道这种方法有什么缺点吗?

可以更优雅地完成吗?

谢谢

javascript jquery jquery-deferred

0
推荐指数
1
解决办法
44
查看次数