我正在为我的网站使用带有Razor模板引擎的ASP.NET MVC 3。我目前允许上传文件:
<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>
但是想使用第三方控件,例如NeatUpload,它允许进度条,多文件选择等。
在文档中,它们显示正在使用的控件:
<%@ Register TagPrefix="Upload" Namespace="Brettle.Web.NeatUpload"
Assembly="Brettle.Web.NeatUpload" %>
<Upload:InputFile id="inputFileId" runat="server" />
有一些代码隐藏。
Razor引擎可以理解地不喜欢这种语法。是否有其他方法可以使用第三方控件,或者我运气不好?
答案 0 :(得分:4)
使用Web窗体的第三方控件与纯 MVC应用程序并不真正兼容。话虽如此,您可以使用混合类型的解决方案,在某些地方利用Web表单,在其他地方利用MVC。这不是我个人会做的事,但你可以。
请参阅Scott Hanselman的this post,其中详细介绍了这一点。
在Razor页面上使用Web表单控件只是不起作用。
答案 1 :(得分:1)
专门针对NeatUpload(这太棒了!)现在能够在静态HTML页面上使用javascript上传非常大的文件。显然,无论你使用哪种视图引擎,这都可以与MCV一起使用:)
更通用的解决方案“要求用户控件的开发人员更新到MCV兼容版本”
编辑:我不会改变上面的内容,但请注意NeatUpload现在已经托管http://neatupload.codeplex.com/但可能已经死了(如果你有开发人员的技能和时间,为什么不拿起它呢。)
答案 2 :(得分:0)
Razor视图引擎不支持WebForms控件。您需要找到专门设计用于MVC的库。
答案 3 :(得分:0)
我刚刚发现MVCRecaptcha项目似乎正在做这件事。我没有时间挖掘内部细节,但实质内容包含在两个小文件中。对于那些懒得按照上述链接的人,让我试着解释一下:
基本上,他们以编程方式创建控件,然后调用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;
这意味着你的控制器必须看起来像这样:
[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控件。
答案 4 :(得分:0)
你可以这样做,假设你只想要一个控件内容的渲染,而不关心注册脚本或回发等。
创建自己的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>
答案 5 :(得分:-2)
尝试将控件放在&lt; form runat =“server”&gt;标签