使用MVC的Razor引擎进行ASP.NET控制

时间:2011-03-28 16:25:13

标签: asp.net asp.net-mvc razor neatupload

我正在为我的网站使用带有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引擎可以理解地不喜欢这种语法。是否有其他方法可以使用第三方控件,或者我运气不好?

6 个答案:

答案 0 :(得分:4)

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

请参阅Scott Hanselman的this post,其中详细介绍了这一点。

在Razor页面上使用Web表单控件只是不起作用。

答案 1 :(得分:1)

专门针对NeatUpload(这太棒了!)现在能够在静态HTML页面上使用javascript上传非常大的文件。显然,无论你使用哪种视图引擎,这都可以与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/但可能已经死了(如果你有开发人员的技能和时间,为什么不拿起它呢。)

答案 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;标签