我正在使用ASP.net MVC 3构建一个应用程序,我想知道是否有人知道一个很棒的库来填补内置的html表单字段助手的空白?
例如,创建文本框很简单:
@Html.EditorFor(model => model.TextboxTest)
Run Code Online (Sandbox Code Playgroud)
但是为了创建一个下拉列表,我必须写:
@Html.DropDownListFor(model => model.DropdownTest, Model.DropdownTestData)
Run Code Online (Sandbox Code Playgroud)
它应该写得像
@Html.EditorFor(model => model.DropdownTest)
Run Code Online (Sandbox Code Playgroud)
其中DropdownTest是SelectList.
有一个示例解决方案可以在这里找到.
这是一个radiobuttons列表:它不包含在MVC中(目前).还有另一个很好的解决方案可以在这里找到,我可以用这个解决方案来编写
@Html.RadioButtonListFor(model=>model.Item,Model.ItemList)
Run Code Online (Sandbox Code Playgroud)
所以有可用的解决方案,但没有结构化的库(分别我没有找到),我不想一块一块地复制和粘贴这些解决方案(因为我不能用NuGet轻松更新它),一个整体图书馆会更好,但我找不到.
请帮忙 :)
问题
我有一个长期运行的导入作业,我从一个ajax请求开始,它可能需要几分钟,直到请求完成.当第一个ajax请求正在运行时,我想看看服务器知道导入消失了多少,第二个请求将每2秒左右完成一次.
当我使用该Ext.Ajax方法时,请求似乎被链接 - 第一个ajax请求(导入)运行直到它完成,然后第二个(导入更新)被触发.
我看到Ext.Ajax是单身,所以也许这就是原因.所以我尝试创建自己的Connection对象,Ext.create('Ext.data.Connection')但它不起作用.
我目前的请求链是:
但它应该是:
题
浏览器应该能够处理多个请求,ExtJS内部必须有限制,但我没有找到它?
更新2011-10-16
回答
问题不是ExtJS - 对不起!这是PHP,我的第一个脚本与会话一起工作,第二个脚本也尝试访问会话.并且因为PHP会话是基于文件的,所以会话文件是从第一个请求脚本锁定的,第二个请求脚本必须等到第一个释放会话锁定.
我用我在每个x行之后添加到导入过程(第一个脚本)的一小段代码解决了这个问题:
$id = session_id();
session_write_close();
sleep(1);
session_start($id);
Run Code Online (Sandbox Code Playgroud)
所以它停止并重新加载会话,另一个脚本能够挂钩并获取会话信息.
我有一个带有ajax代理和json阅读器的ExtJS商店:
Ext.create('Ext.data.Store', {
proxy: {
type: 'ajax',
url: '...',
reader: {
type: 'json',
root: 'data',
totalProperty: 'totalCount',
messageProperty: 'message',
successProperty: 'success'
},
...
Run Code Online (Sandbox Code Playgroud)
这是我从服务器获得的:
data: [...]
message: "I want to read this string after the store is loaded"
success: true
totalCount: x
Run Code Online (Sandbox Code Playgroud)
现在我想在加载商店时访问"消息" - 我从哪里获得它?我看了很多,但我找不到一个可以挂钩的地方?代理中唯一的侦听器是异常,这对我没有帮助.
我正在使用Sharepoint中的沙箱解决方案,由于使用了.net 3.5而且没有允许反射的重要限制(关于这个问题).
例1
如果我尝试将JSON字符串反序列化为这样的简单类,它可以正常工作:
JSON STRING
{"field":"Picture1","url":"whatever"}
Run Code Online (Sandbox Code Playgroud)
C#CLASS
public class PictureSetting
{
public string field { get; set; }
public string url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
例2
但是,如果我尝试反序列化更复杂的字符串,我会收到一个错误:
JSON STRING
{
"Rows": [
{
"Columns": [
{
"Width": "100"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
C#CLASSES
internal class PageStructure
{
public List<StructureElement> Rows { get; set; }
public PageStructure()
{
Rows = new List<StructureElement>();
}
}
internal class StructureElement
{
public List<BlockAssigment> Columns { get; set; }
public StructureElement()
{ …Run Code Online (Sandbox Code Playgroud) 我在sharepoint中有一个存储word文档的文档库.
如果我点击文档的链接,我会看到一个对话框,其中包含"你想在readonly或editmode等中打开这个文件",可以在编辑模式下打开它,更改它,直接保存在word中,更改保存在文档库.
文档库中文件的链接如下所示:
<a onfocus="OnLink(this)"
href="/test/DocLib2/wordtest.docx"
onmousedown="return VerifyHref(this,event,'1','SharePoint.OpenDocuments','')"
onclick="return DispEx(this,event,'TRUE','FALSE','FALSE',
'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments',
'','','','1','0','0','0x7fffffffffffffff','','')"
>wordtest</a>
Run Code Online (Sandbox Code Playgroud)
如何在我自己的Web部件中创建此链接,其中我有文件和文档库的名称?如果不复制上面的代码,那不是一个好主意......
是否有一些"官方"方法来实现这一目标?
我有一个自定义的JS脚本,我加载到SharePoint中,并且在SP完成自己的初始化之后有问题要让我的init方法执行.
_spBodyOnLoadFunctionNames
我首先尝试了"官方"方式,并在加载后将我的函数名称添加到已执行函数列表中,_spBodyOnLoadFunctionNames.push("myInitMethod");但是不会在每次加载页面时触发,我不能依赖它.
ExecuteOrDelayUntilScriptLoaded
然后我尝试使用ExecuteOrDelayUntilScriptLoaded(myInitMethod, "sp.js");函数,但它不会在每个页面加载时触发.
两种方式都有效 - 但不是每次都有效.我假设在初始化SP 之前有时会加载我的脚本.这主要发生在Chrome上,但也发生在IE上.
如何在SP准备好后确保我的脚本执行?
注意:加载页面并且SP对象未完全初始化时会有一个有趣的行为(ExecuteOrDelayUntilScriptLoaded中的已注册函数尚未被调用):只要我点击页面中的"向上导航"锚点(你在哪里)可以看到subites的hiarchy)以下文件被加载并且我的init函数(在ExecuteOrDelayUntilScriptLoaded中注册)被调用!
所以在点击之后一切都很好 - 但为什么不在页面加载上呢?
鉴于此HTML结构
<div class="item">
<div class="item">
select me
<div class="item">don't select me</div>
</div>
<span>
<div class="item">select me</div>
</span>
</div>
Run Code Online (Sandbox Code Playgroud)
而这个jQuery:
var firstItem = $('.item:first');
var selector = firstItem.find('.item');
selector.css('color', 'red');
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来只标记firstItem div中没有嵌套的.item元素.这里棘手的部分是firstItem本身(或可以)已经嵌套在.item类中.
我试过了什么?
firstItem.find('.item').not('.item .item')
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我们开始的第一级已经是.item类.这可以嵌套x次,所以它可以是.item .item .item .item或者其他什么.并且起始元素没有ID,所以我也不能在选择器中使用它.
我认为解决方案应该是类似于反向的.closest(),它沿着DOM移动并且不搜索已经找到的项目的内容.
在这里准备了一个jsFiddle:http://jsfiddle.net/LWmy3/2/
我有来自具有不同内容的特定操作的传入请求(来自Facebook for Credits处理),因此我有不同的模型类来处理它.
这是我的行动:
public ActionResult Index([ModelBinder(typeof(FacebookCreditModelBinder))] IFacebookRequest facebookRequest)
{
if (facebookRequest is FacebookPaymentsGetItemsRequest)
{
// do whatever
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的模型活页夹.
public class FacebookCreditModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var binder = new DefaultModelBinder();
// how to change the model here in the bindingContext?
return binder.BindModel(controllerContext, bindingContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个FacebookPaymentsGetItemsRequest对象,如果传入的var"方法"是"payments_get_items",FacebookPaymentsStatusUpdateRequestif方法是"payments_status_update",我不知道如何在bindingContext中更改模型的类型.是否可以在自定义模型绑定器中更改模型的类型?
其他方法:我也尝试使用BindModel并且我能够返回正确的对象,但是所有属性都为null,因为它没有被默认的模型绑定器填充:
public override object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
NameValueCollection form = controllerContext.HttpContext.Request.Form;
if (form.Get("method") == "payments_get_items")
{
return new …Run Code Online (Sandbox Code Playgroud) 我有一个简单的ViewModel:
public class IndexViewModel
{
public bool ShowWelcomeMsg { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我需要JS中的这个属性:
<script type="text/javascript">
var ShowWelcomeMsg = @Model.ShowWelcomeMsg;
</script>
Run Code Online (Sandbox Code Playgroud)
但这不正确,因为它输出False而不是false但无论如何,问题更通用,因为我想知道int,string等的解决方案:
编码viewmodel属性以在JavaScript(在Razor中)中使用它的正确方法是什么?
鉴于页面上某处的HTML(可能不同):
<div id="start">
<div>
<div class="buttons">select this</div>
<div class="myControl">
<div class="buttons">dont select this</div>
</div>
<div>
<div class="buttons">select this</div>
</div>
</div>
</div>?
Run Code Online (Sandbox Code Playgroud)
我想用buttons红色标记所有元素:
$('#start').find('.buttons').css('color','red');?
Run Code Online (Sandbox Code Playgroud)
但不是如果它们在里面myControl,所以只有"选择这个"div应该是红色的.
在伪代码中,选择器将是
使用类"按钮"获取每个元素,但忽略类"myControl"中的所有元素
编辑
我不知道启动div也可以有"myControl"类(尽可能地从我的项目中删除代码以使其可读),所以实际上它看起来像这样(和完整的块也可以用myControl嵌套在更多的div中.
所以不幸的是(对我原来的问题是正确的)答案在那种情况下不起作用,对不起!知道如何调整其中一个答案来解决这个问题吗?
<div class="myControl" id="start">
<div>
<div class="buttons">select this</div>
<div class="myControl">
<div class="buttons">dont select this</div>
</div>
<div>
<div class="buttons">select this</div>
</div>
</div>
</div>?
Run Code Online (Sandbox Code Playgroud)
这里有新的jsfiddle.
解
所以最终的解决方案是:
$('#start').find('.buttons:not("#start div.myControl div.buttons ")')
.css('color','red');?
Run Code Online (Sandbox Code Playgroud) 我有一种奇怪的行为,也许我错过了一些东西.
我有这个DOM元素(Sharepoint Ribbon Element,但无关紧要),我想通过ID选择jQuery:
<span class="ms-cui-row"
id="Ribbon.EditingTools.CPEditTab.Font-Medium-0-0">...</span>
Run Code Online (Sandbox Code Playgroud)
如果我用类名选择它,$('.ms-cui-row')我可以选择它,但我不能用id $('#Ribbon.EditingTools.CPEditTab.Font-Medium-0-0').我甚至无法选择它$('[id="Ribbon.EditingTools.CPEditTab.Font-Medium-0-0"]').
那么这里有什么意义呢?也许在id名称中使用点不是一个好主意 - 但那是微软不是我,我无法改变它.但它们对他们来说似乎没问题?
我准备了一个jsfiddle来玩.
c# ×4
javascript ×4
jquery ×3
sharepoint ×3
extjs4 ×2
c#-4.0 ×1
dom ×1
events ×1
html-helper ×1
json ×1
paperjs ×1
php ×1
razor ×1