在ASP.NET MVC 2中,您可以使用此URL和此控制器方法:
GET http://server/controller/get?id=5
public ActionResult Get(int id)
{
...
}
Run Code Online (Sandbox Code Playgroud)
ModelBinder会将id=5查询字符串转换id = (int) 5为方法参数.但是,这不起作用:
GET http://server/controller/get?idlist=1,2,3,4,5
public ActionResult Get(int[] idlist)
{
...
}
Run Code Online (Sandbox Code Playgroud)
idlist参数中将为null.虽然对此进行解析非常简单,但我想知道是否有办法更改方法签名或查询字符串以使默认的ModelBinder自动反序列化数组/集合?
我在ASP.NET MVC中有一个控制器方法,如下所示:
public ActionResult GetAlbumPictures(int albumId)
{
var album = AlbumRepo.GetSingle(albumId);
var pictures = album.Pictures;
return View(pictures);
}
Run Code Online (Sandbox Code Playgroud)
此方法的路由如下所示:
routes.MapRoute(null,
"pictures"
new { controller = "Album", action = "GetAlbumPictures" });
Run Code Online (Sandbox Code Playgroud)
用户将使用以下URL获取图片,按照相册ID进行过滤:
GET http://server/pictures?albumid=10
Run Code Online (Sandbox Code Playgroud)
但是,我想将querystring参数更改为album而不是albumid:
GET http://server/pictures?album=10
Run Code Online (Sandbox Code Playgroud)
这意味着需要将控制器方法修改为:
public ActionResult GetPictures(int album)
{
...
}
Run Code Online (Sandbox Code Playgroud)
然而,这是不理想的,因为现在的方法有一个名为参数album,其可以被混淆为Album 对象来代替ID的Album.
我的问题是,是否有任何方法配置ASP.NET MVC,以便在路由中,它将接收一个调用的查询字符串参数album,但然后将其作为albumId参数传递给控制器?
PS我知道我可以在路由表中执行此操作:
routes.MapRoute(null,
"album/{albumId}/pictures",
new { controller = "Album", action = "GetAlbumPictures" });
Run Code Online (Sandbox Code Playgroud)
但由于遗留问题,我必须使其适用于查询字符串方法.
我目前有一个资产管理代码的固定格式,它使用美元符号使用Groovy字符串格式:
def code = "ITN${departmentNumber}${randomString}"
Run Code Online (Sandbox Code Playgroud)
这将生成如下代码:
ITN120AHKXNMUHKL
但是,我有一个新的要求,即代码格式必须是可自定义的.我想通过允许用户设置自定义格式字符串来公开此功能,例如:
OCP $ {} departmentNumber十一$ {} randomString
PAN - $ {} randomString
哪个会输出:
OCP125XIBQHNKLAPICH
PAN-XJKLBPPJKLXHNJ
然后,哪个Groovy将使用适当的变量值进行解释和替换.这是可能的,还是我必须手动解析占位符并手动执行string.replace?
我有一堆我创建的POCO,我想创建一个持久层.事实上,我真的不在乎数据是如何存储在SQL Server中的,我只是希望它存储起来.换句话说,我想告诉ORM工具,"这里有一些POCO类,保存它们." 并且不必做任何事情.是否有任何可以做到这一点的C#ORM工具?我一直在努力让Fluent NHibernate工作,而且Subsonic不支持人际关系,这使得像"为一个帖子获取所有评论"这样的事情非常困难.它需要能够自动生成数据库模式,而不必设置一堆属性和诸如此类的东西.
我见过的几乎所有Ninject示例都解释了如何在ASP.NET MVC中使用它,它会自动将依赖项注入控制器.我如何手动使用Ninject?假设我有一个自定义ActionResult:
public class JsonResult : ActionResult
{
[Inject] public ISerializer Serializer { get; set; }
public JsonResult(object objectToSerialize)
{
// do something here
}
// more code that uses Serializer
}
Run Code Online (Sandbox Code Playgroud)
然后在我的控制器中,我正在使用这样JsonResult的方法:
public ActionResult Get(int id)
{
var someObject = repo.GetObject(id);
return new JsonResult(someObject);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我自己实例化了这个对象,它回避了Ninject的注入,并且Serializer将为null.但是,按照以下方式执行此操作对我来说似乎并不合适:
public ActionResult Get(int id)
{
var someObject = repo.GetObject(id);
return IoC.Kernel.Get<JsonResult>(someObject);
}
Run Code Online (Sandbox Code Playgroud)
因为现在控制器中不仅存在对Ninject的依赖,而且还必须在静态类/单例中公开Ninject内核,并确保依赖注入的对象仅通过内核创建.
有没有办法以某种方式配置Ninject注入依赖,而不依赖于暴露内核?new如果可能的话,我希望能够使用关键字.
dependency-injection ninject inversion-of-control actionresult asp.net-mvc-2
我正在使用jQuery Tablesorter对表进行排序.我的一个列看起来像这样:
<td>
<div>
<span class="green">Yes</span> <a href="##">(unverify)</a>
</div>
<div class="hidden">
<span class="red">No<>/a> <a href="##">(verify)</a>
</div>
</td>
Run Code Online (Sandbox Code Playgroud)
换句话说,有两个div,一个显示是绿色的链接,以及其他显示没有红色的链接.其中一个div总是被隐藏,只要用户点击链接,这两个就会被切换.
jQuery Tablesorter无法对此列进行排序.有没有办法让它这样做,或者我是否必须修改HTML才能使它工作?
如果属性不为null,我正在使用Grails在域类上设置属性.目前,代码看起来像这样:
def product = Product.getById(5);
if (!product.Name) {
product.Name = "Default Product"
}
if (!product.Price) {
product.Price = 5;
}
if (!product.Type) {
product.Type = "Shampoo"
}
Run Code Online (Sandbox Code Playgroud)
在Groovy中实现此代码块的更好方法是什么?我设法将其简化为:
product.Name = product.Name ?: "Default Product"
product.Price = product.Price ?: 5
product.Type = product.Type = "Shampoo"
Run Code Online (Sandbox Code Playgroud)
但我希望能够做这样的事情(不是有效的代码):
product {
Name = product.Name ?: "Default Product",
Price = product.Price ?: 5,
Type = product.Type ?: "Shampoo"
}
Run Code Online (Sandbox Code Playgroud)
你们会推荐我做什么?
我在Grails中有一段代码:
def product = Product.get(5) ?: new Product()
product.isDiscounted = product.isDiscounted ?: true
Run Code Online (Sandbox Code Playgroud)
问题是,如果isDiscounted已经为现有产品设置了属性并且它是假的,我最终会将其更改为true.是否可以检查物体是否是瞬态的?
我有一个看起来像这样的表:
ID StartRange EndRange
----------------------------
1 1 3
2 4 8
3 9 12
Run Code Online (Sandbox Code Playgroud)
依此类推,因此有超过500万条记录。最后一条记录如下所示:
ID StartRange EndRange
---------------------------------
5235976 9894727374 9894727378
Run Code Online (Sandbox Code Playgroud)
换句话说,StartRange和EndRange永远不会为每个记录重叠。
我需要进行查询,以找到与范围匹配的数字的对应ID:
SELECT ID FROM BigTable WHERE '5000000' BETWEEN StartRange AND EndRange;
Run Code Online (Sandbox Code Playgroud)
不幸的是,此查询需要几秒钟才能完成。我需要对其进行优化,以使其花费最少的执行时间。我做了一点研究,看起来添加索引似乎无济于事,因为它仅在数字恰好是StartRange或EndRange值时才适用,但在介于两者之间的情况下才适用。
有没有人有任何我可以用来减少执行时间的提示或技巧?理想情况下,我希望它在1秒以下。
c# ×4
groovy ×3
asp.net-mvc ×2
grails ×2
actionresult ×1
enums ×1
html ×1
jquery ×1
modelbinders ×1
mysql ×1
ninject ×1
optimization ×1
orm ×1
poco ×1
query-string ×1
routing ×1
sorting ×1
sql ×1
tablesorter ×1
url ×1