基本上,我有一个带有脚本管理器的Web窗体和一个按钮,用于更新从类webspider(用于搜索给定URL的损坏链接的网络蜘蛛)返回的结果。 我正在尝试将代码转换为mvc,并实现了大部分功能,但以粗体突出显示的代码除外,因为我在mvc视图中没有脚本管理器,请提供一些有关如何执行此操作的提示,非常感谢。 -

default.aspx-

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_check404._Default" %>

<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
    <section class="featured">
        <div class="content-wrapper">
            <hgroup class="title">
                <h1><%: Title %>.</h1>
                <h2>Modify this template to jump-start your ASP.NET application.</h2>
            </hgroup>
            <p>
                To learn more about ASP.NET, visit <a href="http://asp.net" title="ASP.NET Website">http://asp.net</a>.
                The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET.
                If you have any questions about ASP.NET visit
                <a href="http://forums.asp.net/18.aspx" title="ASP.NET Forum">our forums</a>.
            </p>
        </div>
    </section>
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <h3>Search results:</h3>

    <asp:Label ID="lblTot" runat="server"  />

<asp:Label runat="server" ID="lblStatus" />
 <asp:UpdatePanel runat="server" ID="pnlLinks"> 
    <ContentTemplate> --> 
        <asp:GridView runat="server" ID="grvLinks" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="NavigateUrl" HeaderText="Url" />
                <asp:ButtonField DataTextField="Status" HeaderText="Status" />
            </Columns>
        </asp:GridView>
        <asp:Button runat="server" ID="btnUpdateResults" Text="Update Results" />
 </ContentTemplate>
</asp:UpdatePanel>

default.aspx.cs-

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using _check404.Spider;
using System.Net;

namespace _check404
{
     public partial class _Default : Page
    {

        private string script = @"setTimeout(""__doPostBack('{0}','')"", 5000);";
        private WebSpider WebSpider
        {
            get { return (WebSpider)(Session["webSpider"] ?? (Session["webSpider"] = new WebSpider())); }
        }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (!this.WebSpider.IsRunning)
            {
                string url = "http://bbc.co.uk";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                    this.WebSpider.Execute(url);
                lblTot.Text = WebSpider.Tot.ToString();
            }

////////////////////////以下代码是我要转换的代码

         if (this.WebSpider.IsRunning)
           {
               this.lblStatus.Text = "Processing...";
               ScriptManager.RegisterStartupScript(this, this.GetType(),
                   this.GetType().Name, string.Format(script, this.btnUpdateResults.ClientID), true);
           }

////////////////////////////////////////////////// /////////////////////////////////////

            this.grvLinks.DataSource = this.WebSpider.Links;
            this.grvLinks.DataBind();
        }


    }
}

spider.cs-

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web;

namespace _check404.Spider
{
    public class WebSpider
    {
        public int Tot { get; set; }
        const int LIMIT = 10;
        string[] invalidTypes = { ".zip", ".doc", ".css", ".pdf", ".xls", ".txt", ".js", ".ico" };
        public List<Link> Links;
        public bool IsRunning { get; set; }
        public WebSpider()
        {
            this.Links = new List<Link>();
        }
        public void Execute(string url)
        {
            this.Links.Clear();
            this.Links.Add(new Link() { Status = HttpStatusCode.OK, NavigateUrl = url });
            this.IsRunning = true;
            WaitCallback item = delegate(object state) { this.FindLinks((UrlState)state); };
            ThreadPool.QueueUserWorkItem(item, new UrlState() { Url = url, Level = 0 });
            Tot = Links.Count();
        }
        public void FindLinks(UrlState state)
        {
            try
            {
                string html = new WebClient().DownloadString(state.Url);
                MatchCollection matches = Regex.Matches(html, "href[ ]*=[ ]*['|\"][^\"'\r\n]*['|\"]");
                foreach (Match match in matches)
                {
                    string value = match.Value;
                    value = Regex.Replace(value, "(href[ ]*=[ ]*')|(href[ ]*=[ ]*\")", string.Empty);
                    if (value.EndsWith("\"") || value.EndsWith("'"))
                        value = value.Remove(value.Length - 1, 1);
                    if (!Regex.Match(value, @"\((.*)\)").Success)
                    {
                        if (!value.Contains("http:"))
                        {
                            Uri baseUri = new Uri(state.Url);
                            Uri absoluteUri = new Uri(baseUri, value);
                            value = absoluteUri.ToString();
                        }
                        if (this.Links.Exists(x => x.NavigateUrl.Equals(value))) continue;
                        try
                        {
                            bool validLink = true;
                            foreach (string invalidType in invalidTypes)
                            {
                                string v = value.ToLower();
                                if (v.EndsWith(invalidType) || v.Contains(string.Format("{0}?", invalidType)))
                                {
                                    validLink = false;
                                    break;
                                }
                            }
                            if (validLink)
                            {
                                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(value);
                                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                                this.Links.Add(new Link() { Status = response.StatusCode, NavigateUrl = value });
                                if (response.StatusCode == HttpStatusCode.OK && state.Level < LIMIT)
                                {
                                    WaitCallback item = delegate(object s) { FindLinks((UrlState)s); };
                                    ThreadPool.QueueUserWorkItem(
                                        item, new UrlState() { Url = value, Level = state.Level + 1 });
                                }
                            }
                        }
                        catch
                        {
                            this.Links.Add(new Link()
                            {
                                Status = HttpStatusCode.ExpectationFailed,
                                NavigateUrl = value
                            });
                        }
                    }

                }
            }
            catch
            {
                ///
                /// If downloading times out, just ignore...
                /// 
            }
        }
    }
}

===============>>#1 票数:1 已采纳

如果您的蜘蛛作业正在运行,您似乎在尝试在5秒后自动单击一个按钮。

脚本管理器所做的全部工作就是在生成标记时嵌入包含您的javascript的标签。

同上说,最简单的方法是向模型添加属性。

class MyModel
{
    public bool SpiderRunning { get; set; }
} 

然后在您的控制器中进行设置:

model.SpiderRunning = this.WebSpider.IsRunning

然后在您的视图中,如果此值为true,则仅将脚本添加到页面:

@if(Model.SpiderRunning)
{
    <script>setTimeout(function(){document.getElementById("btnUpdateResults").click();}, 5000);</script>
}

  ask by Bob the Builder translate from so

未解决问题?本站智能推荐:

1回复

将ASP.NET Web表单转换为多个ASP.NET MVC项目

我有一个Webform项目,我将重建该项目并将其转换为新的MVC项目。 当我这样做时,我想在较小的项目中分开页面。 这就是我在Webform项目中所拥有的。 网站: 管理员 博客 团体 Index.aspx Login.aspx 创建.
1回复

Webform母版页MVC PartialRender服务器事件未触发

好的,所以我有一个Webforms项目,我想开始做MVC。 我希望MVC页面可以使用Webforms主页,直到可以将更多内容转移到MVC为止。 我使用此解决方案找到了下面列出的解决方案(除了服务器事件,该项目确实运行良好) https://github.com/MicahArmantr
1回复

通过WebForm中的Response.Redirect将参数传递给MVC控制器

我有一个带有ReportViewer的webform(.aspx页面),它使用服务器报告和一个重定向到MVC控制器动作的按钮 - Index 。 我想将服务器报告参数传递给我的控制器操作。 可能吗? 所以,我得到了参数: 我的索引ActionResult通常看起来像:
1回复

在Webform项目中显示MVC WebGrid时出现问题

我已经将MVC文件/文件夹添加到现有的Webforms项目中。 在参考中,我已将参考添加到“ System.Web.Helpers.dll”。 现在,在尝试显示Webgrid时,我收到以下消息: Message =继承类型违反了安全性规则:“ System.Web.Helpers.We
1回复

将WebForm添加到MVC应用程序以使用较少扩展的Webform页面

我有一个MVC应用程序,其中必须集成一些Web表单页面。 我只是向根目录添加了一个Webform“ WebForm.aspx”,当我使用文件扩展名http://localhost:54363/WebForm.aspx访问Webform时,它可以正常工作,但是当我尝试不使用文件扩展名访问它时
2回复

像mvc这样的文件夹中的Webform路由主页,而不是站点的根目录

我在asp.net webforms 3.5sp1项目中设置了Webform路由设置。 我希望将站点的文件放在一个名为content的目录中,该目录包括主页,就像我想使用同一系统运行多个站点一样。 在MVC中,有一个空白的默认页面,主页位于名为home的文件夹中。 我似乎无法使用Web
1回复

从Web表单重定向到MVC索引视图

我有一个托管多个SSRS报告的MVC应用程序,每个报告都在单独的WebForm上。 这些报告都在“主页”文件夹的“索引视图”中捆绑在一起,在该文件夹中,我获得了href链接以将用户定向到他们想要的报告。 现在的麻烦是,我试图在这些WebForms上创建一个按钮,该按钮会将用户重定向回In
2回复

如何在基于asp.net Webform的网站上的云托管上处理会话管理

假设我有一个在.net 4.0框架上使用asp.net webforms开发的网站,需要将其迁移到rackhosting托管之类的云托管。 该网站当前使用asp.net默认成员资格进行用户管理,并且还使用多个会话变量来存储临时变量。 该网站托管在内部托管的专用服务器上。 所以我
2回复

在ASP.NET MVC5中等效的系统类(System.Web.UI.Page)属性(httpresponse)

我正在从Webform到mvc复制一组代码。 我有一个Webform代码,其中 Webform(aspx.cs): 其中Response是System.Web.Ui.Page类的属性。 我不确定是否可以在MVC控制器代码中使用它,因为它是页面类。 我尝试了什么? 1
1回复

为什么不能将Webform放入Views / Home文件夹?

我在Webform中使用ASP.NET MVC 5.2.2.0(C#)。 当我执行此步骤时: right click solution -> Add -> New item... -> create new webform 调试后,当我在url上键入“ localh