Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET控件与MVC';s剃须刀发动机_Asp.net_Asp.net Mvc_Razor_Neatupload - Fatal编程技术网

ASP.NET控件与MVC';s剃须刀发动机

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

我正在为我的网站使用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 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节。相关示例是文件。我决定将所需的逻辑封装到一个更易于使用的包中。