5

我正在为我的网站使用带有 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 引擎不喜欢这种语法是可以理解的。有没有其他方法可以使用 3rd 方控件,还是我不走运?

4

6 回答 6

4

与 Web 窗体一起使用的第三方控件与MVC 应用程序并不真正兼容。话虽如此,您也许可以使用混合类型的解决方案,在某些地方利用 Web 表单,在其他地方利用 MVC。这不是我个人会做的事情,但你可以。

请参阅Scott Hanselman 的这篇文章,其中详细介绍了如何做到这一点。

但是,在 Razor 页面上使用 Web 表单控件是行不通的。

于 2011-03-28T16:39:30.497 回答
1

特别是对于 NeatUpload(太棒了!),现在可以使用 javascript 在静态 HTML 页面上上传非常大的文件。显然,无论您使用什么视图引擎,这都适用于 MCV :)

http://www.brettle.com/NeatUpload-1.3/dotnet/docs/Manual.html#3.11.Using%20NeatUpload%20from%20JavaScript%7Coutline

所以更通用的解决方案“要求用户控件的开发人员更新到 MCV 兼容版本”

编辑:我不会更改上述内容,但请注意 NeatUpload 现在托管在http://neatupload.codeplex.com/但可能已死(如果您有开发人员技能和时间,为什么不拿起它!)

于 2011-06-10T22:46:17.383 回答
0

Razor 视图引擎不支持 WebForms 控件。您将需要找到一个专门设计用于 MVC 的库。

于 2011-03-29T01:38:47.557 回答
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 控件。

于 2013-04-12T20:05:58.837 回答
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>
于 2016-04-27T17:06:01.190 回答
-2

尝试将控件放在 <form runat="server"> 标记中。

于 2011-03-28T16:40:32.123 回答