ASP.NET控件与MVC';s剃须刀发动机
我正在为我的网站使用ASP.NETMVC3和Razor模板引擎。我目前允许像这样上传文件:ASP.NET控件与MVC';s剃须刀发动机,asp.net,asp.net-mvc,razor,neatupload,Asp.net,Asp.net Mvc,Razor,Neatupload,我正在为我的网站使用ASP.NETMVC3和Razor模板引擎。我目前允许像这样上传文件: <form action="/File/Upload" method="post" enctype="multipart/form-data"> <label for="file">Upload a file:</label> <input type="file" name="file" id="file" /> <input
<form action="/File/Upload" method="post" enctype="multipart/form-data">
<label for="file">Upload a file:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
<%@ Register TagPrefix="Upload" Namespace="Brettle.Web.NeatUpload"
Assembly="Brettle.Web.NeatUpload" %>
<Upload:InputFile id="inputFileId" runat="server" />
[CaptchaValidator]
[AcceptVerbs( HttpVerbs.Post )]
public ActionResult CreateComment( Int32 id, bool captchaValid )
{
if (!captchaValid)
{
ModelState.AddModelError("_FORM", "You did not type the verification word correctly. Please try again.");
}
// ...
}
上载文件:
但希望使用第三方控件,例如,允许进度条、多文件选择等
在文档中,它们显示了正在使用的控件,如下所示:
<form action="/File/Upload" method="post" enctype="multipart/form-data">
<label for="file">Upload a file:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
<%@ Register TagPrefix="Upload" Namespace="Brettle.Web.NeatUpload"
Assembly="Brettle.Web.NeatUpload" %>
<Upload:InputFile id="inputFileId" runat="server" />
[CaptchaValidator]
[AcceptVerbs( HttpVerbs.Post )]
public ActionResult CreateComment( Int32 id, bool captchaValid )
{
if (!captchaValid)
{
ModelState.AddModelError("_FORM", "You did not type the verification word correctly. Please try again.");
}
// ...
}
后面有一些代码
Razor引擎不喜欢这种语法是可以理解的。是否有其他方法使用第三方控件,或者我运气不好?与Web表单一起使用的第三方控件与纯MVC应用程序并不兼容。话虽如此,您可能能够使用混合型解决方案,在某些地方利用Web表单,在其他地方利用MVC。这不是我个人会做的事,但你可以 斯科特·汉斯曼(Scott Hanselman)对此做了详细介绍
但是,在Razor页面上使用web窗体控件是行不通的。尝试将控件放置在标记中。Razor视图引擎不支持web窗体控件。您需要找到一个专门设计用于MVC的库。专门用于NeatUpload(这太神奇了!)现在可以在静态HTML页面上使用javascript上传非常大的文件。显然,无论您使用什么视图引擎,这都同样适用于MCV:) 因此,更通用的解决方案是“要求用户控件的开发人员更新到与MCV兼容的版本” 编辑:我不会更改以上内容,但请注意,NeatUpload现在已托管,但可能已经死了(如果您有开发人员的技能和时间,为什么不选择它!)我刚刚发现,似乎正在这样做的项目。我还没来得及深入了解内部细节,但其精髓包含在两个小文件中。对于那些懒得遵循上述链接的人,让我试着解释一下: 基本上,它们以编程方式创建控件,然后调用RenderControl在线路上转储html:
var captchaControl = new RecaptchaControl { ... }
var htmlWriter = new HtmlTextWriter(new StringWriter());
captchaControl.RenderControl(htmlWriter);
return htmlWriter.InnerWriter.ToString();
在响应端,它们会创建一个属性,您可以将该属性添加到MVC操作中:
class CaptchaValidatorAttribute : ActionFilterAttribute {...}
此类重新创建控件,并调用:
var recaptchaResponse = captchaValidtor.Validate();
// this will push the result value into a parameter in our Action
filterContext.ActionParameters["captchaValid"] = recaptchaResponse.IsValid;
这意味着您的控制器必须如下所示:
<form action="/File/Upload" method="post" enctype="multipart/form-data">
<label for="file">Upload a file:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
<%@ Register TagPrefix="Upload" Namespace="Brettle.Web.NeatUpload"
Assembly="Brettle.Web.NeatUpload" %>
<Upload:InputFile id="inputFileId" runat="server" />
[CaptchaValidator]
[AcceptVerbs( HttpVerbs.Post )]
public ActionResult CreateComment( Int32 id, bool captchaValid )
{
if (!captchaValid)
{
ModelState.AddModelError("_FORM", "You did not type the verification word correctly. Please try again.");
}
// ...
}
尽管该项目现已过时,但它展示了如何在MVC应用程序中使用ASP.Net控件。您可以这样做,前提是您只需要呈现控件内容,而不需要注册脚本或回发等 创建自己的HtmlTextWriter,将输出写入其中,然后在Razor中呈现该字符串。这基本上是@VeeTheSecond的想法,简化为实践:
@{
System.Web.UI.WebControls.Label label = new System.Web.UI.WebControls.Label()
{
Text = "Hello World!"
};
HtmlString renderedControl;
using (StringWriter w = new StringWriter())
{
using (HtmlTextWriter htmlW = new HtmlTextWriter(w))
{
label.RenderControl(htmlW);
renderedControl = new HtmlString(w.ToString());
}
}
}
<div>
@renderedControl
</div>
@{
System.Web.UI.WebControls.Label Label=new System.Web.UI.WebControls.Label()
{
Text=“你好,世界!”
};
HtmlString渲染控件;
使用(StringWriter w=new StringWriter())
{
使用(HtmlTextWriter htmlW=新的HtmlTextWriter(w))
{
标签.渲染控制(htmlW);
renderdcontrol=newhtmlstring(w.ToString());
}
}
}
@渲染控件
那不是真的。使用WebFormsViewEngine时,ASP.NET web控件将在ASP.NET MVC页面上按预期工作。将“在MVC页面上”更改为“在剃刀页面上”,然后我将其更改为upvote。@smartcaveman ASP.NET控件不适用于WebFormsViewEngine。一些使用WebForms技术子集的控件可能在MVC aspx视图中工作,但大多数控件肯定不会工作。尽管可以使它们在WebForms视图引擎中工作。不推荐,但可能。将需要服务器端表单的项目放置在MVC中带有runat=“server”的表单中会起作用(假设您有一个表单),并且会破坏您选择使用MVC的目的。为什么还要使用asp控件呢?它们太乱了。我很高兴他们离开了asp控件。使用纯Html和javascript。什么样的标签?它已经在
标记中。还有什么我应该用的吗?对不起,没有逃过我的符号。这是用于webforms视图引擎的,不是razor。和需要回发的控件。上面的链接不起作用,只是指向手册的第3.11节。相关示例是文件。我决定将所需的逻辑封装到一个更易于使用的包中。