我有一个包含asp:Literal的用户控件.
<div>
<asp:Literal id="MenuContainer" runat="server" />
</div>
Run Code Online (Sandbox Code Playgroud)
代码隐藏页面中有一个初始化控件的方法:
internal void Setup(MyBusinessObject obj)
{
MenuObject menu = MenuHelper.GetMenu(obj.State);
if(obj == null)
MenuContainer.Visible = false;
//other code
}
Run Code Online (Sandbox Code Playgroud)
在使用控件的页面中,我在LoadComplete事件处理程序中调用控件的Setup方法(我在Load事件中首先调用它).无论MyBusinessObject为null还是非null,当我在用户控件上访问Literal时,我都会收到错误:
Object reference not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)
是什么原因以及对此有何补救措施?
我注意到在System.Web.UI.WebControls命名空间中的大多数(如果不是全部)标准Web控件上,您可以添加所需的任何属性而不会使页面崩溃.
以asp:Button控件为例.
此代码完全有效:
<form runat="server">
<asp:Button runat="server" Text="Test button" crapAttribute="crapValue" />
</form>
Run Code Online (Sandbox Code Playgroud)
现在,我有一个自定义服务器控件,如果我添加任意属性,它会崩溃.它只接受定义了相应公共属性的属性.
我得到的错误是这样的"控件没有名为"crapAttribute"的公共属性.
我希望我的自定义控件接受任何属性而不会崩溃.我需要做些什么才能工作?
我看过Reflector中的标准控件,它们确实有各种各样的属性和东西,但是我看到的东西没有立即引起我的注意.
我的自定义控件继承自WebControl的价值.
假设我在类中有一个数组或任何其他集合,以及一个返回它的属性,如下所示:
public class Foo
{
public IList<Bar> Bars{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以这样写:
public Bar Bar[int index]
{
get
{
//usual null and length check on Bars omitted for calarity
return Bars[index];
}
}
Run Code Online (Sandbox Code Playgroud) 我使用ObjectListView。并使用方法 RefreshObject() 更新唯一修改的对象。
// The difference between associations and updatedAssociations is only in
// one item, which ID field remains the same.
// So i find an updated item by ID in the associations (before updating).
//And say Object ListView to to refresh this item.
var associationToUpdate = associations.References.Where(
x => x.ID == associationIDToUpdate).FirstOrDefault();
olvAssociations.RefreshObject(associationToUpdate);
// And only after this set the model to updated model
associations = updatedAssociations;
Run Code Online (Sandbox Code Playgroud)
但什么也没有发生。有人知道这是怎么回事吗?
用于获取城市自动填充文本框的自动填充文本框.
我的代码看起来像这样,
<input id="location" type="text" name="q"
data-autocomplete="@Url.Action("locationSearch", "Home",
new { text = "location" })"/>
Run Code Online (Sandbox Code Playgroud)
现在我想将其转换为剃刀syntex.我尝试了这个,但没有工作.
@Html.TextBoxFor(model => model.Location,
new { data-autocomplete = Url.Action("locationSearch", "Home")})
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个?
我正在Web User Controls通过代码创建(我的C#代码写出标记,代码隐藏和设计器文件在回调中写入磁盘).控件创建得很好.我可以将它们添加到我的web项目中并将它们放在页面上.
当我尝试使用LoadControl(path)它加载控件时说:
Unable to load type 'MyNameSpace.UseControlClass'
Run Code Online (Sandbox Code Playgroud)
这是因为尚未编译控件.
但我的要求是动态加载控件而不重新编译解决方案.
如何在创建控制文件时编译用户控件?因为这似乎是唯一的出路.
编辑: - 我的猜测是,由于文件尚未编译,因此不允许运行时加载.我试图使用CodeDom编译器编译代码文件.喜欢:
var filePath = Server.MapPath(path);
var provider = CSharpCodeProvider.CreateProvider("C#");
var opts = new CompilerParameters(new[] { "mscorlib.dll", "System.Web.dll",
"Telerik.Web.Design.dll", "Telerik.Web.UI.dll",
"Telerik.Web.UI.Skins.dll", "MyCurrentDll.dll"});
opts.GenerateExecutable = false;
opts.GenerateInMemory = true;
var cr = provider.CompileAssemblyFromFile(opts, new string[] { filePath+".cs" });
Run Code Online (Sandbox Code Playgroud)
但是,抱怨cannot find metadata file Telerik.Web.Design.dll等等.我不想硬编码Telerik的路径,因为它可能会在托管系统不同(虽然它是在bin当前Web应用程序).也是MyCurrentDll.dll我正在编译代码文件的文件的dll.我该如何解决这个问题?
我的想法是编译代码文件dll动态创建并将其复制到Web应用程序的bin目录.它可能会解决我最初提出的问题.
编辑2: - 在命中和试用后,我能够动态编译代码文件并生成dll.即使在生成dll并将其放入bin …
我正在研究一些代码,这些代码将按顺序加载一堆(20+)大图像(每个~500 KB).每个图像加载之后,它消失.我用这个小提琴从这个讨论为起点.
我已经按照我想要的方式加载图像,但是我需要做其他一些事情而不会破坏这种顺序加载.我需要在第三个和第四个图像之间加载包含iframe的标记,我需要在图像之后加载一个链接.以下是我需要的标记输出示例:
<div id="container">
<img src="img-1.jpg" />
<img src="img-2.jpg" />
<img src="img-3.jpg" />
<div><iframe></iframe></div>
<img src="img-4.jpg" />
<img src="img-5.jpg" />
<img src="img-6.jpg" />
<img src="img-7.jpg" />
<img src="img-8.jpg" />
<img src="img-9.jpg" />
<a href="/link/">Link text</a>
</div>
Run Code Online (Sandbox Code Playgroud)
我可以很好地加载图像,但我仍然坚持如何只在前三个加载后加载iframe,然后加载其余的图像,然后链接.这是我目前的javascript:
var no = 22,
main = [],
i;
for (i = 1; i <= no; i++) {
main[i] = "path/to/image/folder/img-" + i + ".jpg";
}
function loadImages(arr,loc) {
if (arr.length === 0) {
return;
}
function imageLoaded(img) { …Run Code Online (Sandbox Code Playgroud) 我无法将一些字符串渲染代码放在一起,这些代码可以为我提供所有目标.到目前为止,只能权衡利弊.
我正在拍摄一些行为与Windows7桌面快捷方式相同的方式,因为文本上方有一个图像,文本可以包装一次,任何更多的椭圆截断.
如:

我使用TextRenderer.DrawText,我已经试过的各种组合TextFormatFlags,但我只能得到任何一个包装无限期文本,或停在一个单一的线路之间,其省略号文本.
一些例子.提供给界限TextRenderer是,在所有情况下,的边界内ClipRectangle,其中我画的表面.它试图呈现的文本是"这是一个名为#1的组的相当长的名称.".
这段代码:
TextFormatFlags flags = TextFormatFlags.HorizontalCenter |
TextFormatFlags.NoPadding | TextFormatFlags.WordBreak |
TextFormatFlags.EndEllipsis;
Rectangle rect = new Rectangle(x, y, this.Width - 6, this.Height - y);
TextRenderer.DrawText(e.Graphics, _text, Font, rect, _textColor, flags);
Run Code Online (Sandbox Code Playgroud)
...产生这个:

只需删除TextFormatFlags.WordBreak标志就会产生:

我怎么能这样做,比如我尽可能在RectangleI pass 的范围内进行包装,然后在发生截断时结束椭圆?
我正在使用.NET的SyndicationFeed来创建RSS和ATOM提要.不幸的是,我需要在描述元素(SyndicationItem的Content属性)中使用HTML内容,格式化程序会自动对HTML进行编码,但我宁愿将整个描述元素包装在CDATA中,而不对HTML进行编码.
我的(简单)代码:
var feed = new SyndicationFeed("Title", "Description",
new Uri("http://someuri.com"));
var items = new List<SyndicationItem>();
var item = new SyndicationItem("Item Title", (string)null,
new Uri("http://someitemuri.com"));
item.Content = SyndicationContent.CreateHtmlContent("<b>Item Content</b>");
items.Add(item);
feed.Items = items;
Run Code Online (Sandbox Code Playgroud)
有人知道如何使用SyndicationFeed做到这一点吗?我的最后一招是"手动"为feed创建XML,但我宁愿使用内置的SyndicationFeed.
我一直在处理奇怪的问题.我在一个项目中使用KryptonForm.我有一个表单(比如form1),我需要在这个表单的按钮上打开另一个表单.这是代码:
void btn_click(object sender, EventArgs e)
{
Visible = false;
ShowInTaskbar = false;
var f = new Form2();
f.ShowDialog();
Visible = true;
ShowInTaskbar = true;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当Form2关闭时,它也会关闭Form1.我试过DialogResult = DialogResult.None从Form2设置,但没有用.请帮我.
我一直在使用这种技术,这件事从未发生过.
c# ×6
asp.net ×4
properties ×2
.net ×1
autocomplete ×1
javascript ×1
jquery ×1
razor ×1
rss ×1
winforms ×1