我们有一个很好的软件基础,基于Microsoft MVC 2,实体框架4,存储库,POCO,服务和控制层,C#视图,JQuery和html.Firefox在250毫秒内提取100条记录,将其放入模板,将数据链接到标记,然后我们坐下来喝玛格丽塔酒.
Boss走进来说他想要一个iPhone应用程序.我打赌我们也需要一个Android应用程序.
我们可以使用哪些框架轻松地从我们的微软舒适区跳到Apple iPhone/iPad的广泛世界,以及后续的Android宝贝.
我想我们可以使用我们的JSON控制器方法进行通信. 是否有某种类型的客户端JavaScript消费应用程序框架,我们可以得到一个合理的网站,如界面重新工作? 他们不喜欢简单地在Safari中运行整个东西的想法,这非常有效.
需求:
我们用了两年时间,使用MVC和Javascript整合了设计模式,敏捷方法和Domain Driven概念.我们可能需要两到三个月才能重新生成相同的功能.
我想接受一个字符串数组,其中来自客户端的条件就像field == value.创建一个可以接受构造函数中的字符串并输出lambda表达式来表示Where子句的规范对象真的很不错.例如,我可以执行以下操作:
var myCondition = new Specification<Product>( myStringArrayOfConditions);
var myProducts = DB.Products.Where( myCondition);
Run Code Online (Sandbox Code Playgroud)
你怎么会"name == Jujyfruits"变成DB.Products.Where(p => p.name == "JujyFruits")?
如果我们做了
throw new ArgumentException("Cannot do that");
Run Code Online (Sandbox Code Playgroud)
你如何断言ArgumentException微软的测试框架发生了这种情况?
Phil Haack有一篇关于如何使用JSON,数据绑定和数据验证的优秀博客文章.
输入浏览器的"同源策略安全限制".和JSONP,您使用$ .getJSON()来检索内容.
是否有内置的MVC 3方法来做到这一点,还是我需要遵循这样的帖子的建议?你可以发布内容吗?我问,因为我的同事实现了JsonPfilterAttribute以及其他工作.如果MVC 3中已存在某些内容,显然最好避免这种情况.
编辑:
总结:除访问POST变量外,一切都有效,即如何POST在上下文中访问变量?(注释在代码的最后部分标记)
我选择使用这种格式来调用服务器:
$.ajax({
type: "GET",
url: "GetMyDataJSONP",
data: {},
contentType: "application/json; charset=utf-8",
dataType: "jsonp",
jsonpCallback: "randomFunctionName"
});
Run Code Online (Sandbox Code Playgroud)
产生这种反应:
randomFunctionName([{"firstField":"111","secondField":"222"}]);
Run Code Online (Sandbox Code Playgroud)
如果我使用的话,这一切都很有效GET.但是,我仍然无法将其作为一个工作POST.这是Nathan Bridgewater 在这里发布的原始代码.此行找不到POST数据:
context.HttpContext.Request["callback"];
Run Code Online (Sandbox Code Playgroud)
要么我应该Form以某种方式访问,要么MVC数据验证器正在剥离POST变量.
如何context.HttpContext.Request["callback"];编写访问POST变量或MVC是否出于某种原因剥离这些值?
namespace System.Web.Mvc
{ public class JsonpResult : ActionResult
{ public JsonpResult() {}
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; …Run Code Online (Sandbox Code Playgroud) 从内到外,这些是我们的MVC应用层:
一切都很好,直到我需要为第5步创建一个ViewModel来同时提供Razor视图以及JSON/Knockout ViewModel:
由于Controller无法直接访问存储库,这是否意味着我为每个允许编辑内容的视图创建服务? 我需要从存储库中获取POCO,并根据需要为每个字段类型添加所有选项.
为每个视图创建单独的服务似乎是多余的.例如,viewModel用于编辑地址,而viewModel用于编辑也具有地址的房地产属性.我们可以有十几种形式来编辑相同的地址POCO.
为了使这个问题更容易回答,是否允许Controller直接访问存储库一个漏洞的抽象?
如果您创建一个Filter对象,其中包含Linq的条件,通常在where子句中,如下所示:
var myFilterObject = FilterFactory.GetBlank();
myFilterObject.AddCondition("Salary", "lessThan", "40000");
var myResult = myRepository.GetEmployees(myFilterObject);
Run Code Online (Sandbox Code Playgroud)
如何在不使用大案例陈述的情况下将Linq字段与字段名称匹配?
return from e in db.Employee
where e.Salary < 40000
select new IList<EmployeeViewModel> { Name= e.name, Salary= e.Salary };
Run Code Online (Sandbox Code Playgroud)
我假设您需要将一个对象发送到指定过滤的存储库,以便您只提取所需的记录.我假设Linq没有预编译(除非您创建自定义委托和函数),因此您应该能够动态指定要筛选的字段.
如果你可以像某些类型的Expando对象那样做e ["Salary"]这样的话会很好.
根据需要跳到"特定问题".一些背景:
场景: 我有一组产品,其中包含一个填充了DDL的"向下钻取"过滤器(查询对象).每个渐进式DDL选择将进一步限制产品列表以及DDL的剩余选项.例如,从工具中选择锤子会限制产品尺寸仅显示锤子尺寸.
当前设置:我创建了一个查询对象,将其发送到存储库,并将每个选项提供给SQL"表值函数",其中空值表示"获取所有产品".
我认为这是一个很好的努力,但远非DDD可以接受.我想避免SQL中的任何"编程",希望用存储库做所有事情.对此主题的评论将不胜感激.
具体问题:
我如何将此查询重写为动态查询?像101 Linq Examples这样的链接会很棒,但是有一个动态查询范围.我真的想将这个方法传递给引号""中的字段,我想要一个选项列表以及有多少产品具有该选项.
from p in db.Products
group p by p.ProductSize into g
select new Category {
PropertyType = g.Key,
Count = g.Count() }
Run Code Online (Sandbox Code Playgroud)
每个DDL选项都有"选择(21)",其中(21)是具有该属性的产品数量.选择一个选项后,所有其他剩余的DDL将使用剩余的选项和计数进行更新.
编辑:附加说明:
.OrderBy("it.City") // "it" refers to the entire record
.GroupBy("City", "new(City)") // This produces a unique list of City
.Select("it.Count()") //This gives a list of counts... getting closer
.Select("key") // Selects a list of unique City
.Select("new (key, count() as string)") // +1 to …Run Code Online (Sandbox Code Playgroud) 如果您有一个从JSON创建的产品对象数组,那么如何将原型方法添加到产品对象中,以便它们都指向相同的方法?如何训练JavaScript识别数组中的所有产品对象是不是重新创建它们的同一个类的实例?
例如,如果我下拉产品的JSON数组,并希望数组中的每个产品都有原型方法,我如何将单个原型方法添加到每个产品副本?
我首先想到的是一个Product构造函数,它将产品JSON数据作为参数,并返回一个带有原型等的新产品,它将取代从服务器发送的数据.我认为这是不切实际的,因为你正在重新创建对象.我们只想添加所有对象共有的函数.
是否可以将$.extend对象的原型属性转换为JSON对象,以便每个JSON对象引用完全相同的函数(而不是副本)?
例如:
var Products = [];
Products[0] = {};
Products[0].ID = 7;
Products[0].prototype.GetID = function() { return this.ID; };
Products[1].ID = 8;
Products[1].prototype = Products[0].prototype; // ??
Run Code Online (Sandbox Code Playgroud)
我知道这看起来很糟糕,但是如果你$.extend对每个Product对象原型的方法进行JQuery $.extend怎么办?创建一个加载了原型的对象然后在现有的Product对象上创建该对象?你会怎么编码?有什么更好的可能性?
假设我知道更新主键是坏的.
还有其他问题暗示inserted和updated记录表的位置匹配(第一个匹配另一个匹配.)这是事实还是巧合?
当主键在更新时发生更改时,是否有任何可以将两个表连接在一起的内容?
在下面的代码中,我成功地在C#中使用Microsoft的System.Linq.Dynamic来评估类似于Javascript的字符串表达式eval().但是,在调用新函数时 ,我无法弄清楚如何保证参数名称和相应的值匹配."SKU + \" \" + Name"可以像回归1234 Cola一样容易Cola 1234.我有几十个参数.
System.Dynamic.Linq的Parse方法用于Dictionary<string,object>在内部保存参数,这是我的问题,因为Dictionary不保证像数组和列表这样的顺序. 我假设因为Microsoft选择使用Dictionary,必须对下面的代码进行一些简单的修复,以确保参数值匹配. 代码在LinqPad中输入.
命名参数可能像Name: "Cola", SKU: "1234"?是否有一些数据类型或技术可用于保证参数名称和值匹配?这是否需要更改Microsoft的代码才能替换Dictionary?
var symbols = new Dictionary<String, Object>(); // Cannot change symbols datatype
var paramExp = new List<ParameterExpression>();
var paramVal = new List<String>();
var fields = new Dictionary<String,String>(); // Sample Data
fields["SKU"] = "1234";
fields["Name"] = "Cola";
fields["Type"] = "Drink";
var expression = "SKU + \" \" + …Run Code Online (Sandbox Code Playgroud) c# ×5
linq ×2
android ×1
c#-4.0 ×1
dynamicquery ×1
iphone ×1
javascript ×1
jquery ×1
json ×1
jsonp ×1
linq-to-sql ×1
repository ×1
sql ×1
t-sql ×1
triggers ×1
unit-testing ×1
where-clause ×1