找不到文件夹中新创建的WebForm错误

时间:2019-01-18 01:07:13

标签: asp.net asp.net-mvc visual-studio model-view-controller bootstrap-4

我正在ASP.NET MVC中创建一个项目,这个想法是创建独立的视图,为此,我创建了一个公用文件夹,并在其中创建了一个WebForm.aspx,其代码位于{{ 1}}。我已经从NuGet打包器安装了Bootstrap,已经将脚本引用到WebForm中,如下所示:

.aspx.cs

但是当我运行它时,它显示了一个错误:

enter image description here

这是结构:

enter image description here

但是当我从由文件夹组成的Web窗体中运行它时,它可以正常运行。

enter image description here

如何使位于公用文件夹内的aspx起作用?

3 个答案:

答案 0 :(得分:2)

HTTP 404页面指示在控制器定义上不存在PublicView控制器操作方法名称。如果您要将Webforms页面与MVC路由路径样式相关联,例如/Public/PublicView映射到/Views/Public/PublicView.aspx而不创建对该页面的控制器操作,MapPageRoute()方法可能适合您的需求。

只需确保将网络表单路由路径放在默认的MVC路由之前,因为RouteConfig会从上到下评估路由定义,因此首先评估最具体的路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // webforms page route
    routes.MapPageRoute(
        "PublicView",
        "Public/PublicView",
        "~/Views/Public/PublicView.aspx"
    );

    // MVC route
    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

如果要使用一个MapPageRoute映射一个文件夹内的所有ASPX页面,请将其调整为包含页面名称占位符:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // webforms page route
    routes.MapPageRoute(
        "PublicView",
        "Public/{pageName}",
        "~/Views/Public/{pageName}.aspx"
    );

    // MVC route
    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

注释:

1)如果要将ASPX页面用作通过控制器操作方法呈现的MVC视图页面,则必须使用Inherits指令中的System.Web.Mvc.ViewPage来更改Page,如下所示:< / p>

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" ... %>

然后使用MVC HTML帮助器替换webforms服务器控件,然后从控制器调用页面,如下所示:

public class PublicController : Controller
{
    public ActionResult PublicView()
    {
        return View("PublicView");
    }
}

2)避免直接在代码隐藏的ASPX页面中将System.Web.UI.Page替换为System.Web.Mvc.ViewPage命名空间,因为在使用服务器控件时可能会引发一些问题。

参考: How to define routes for Web Forms applications

答案 1 :(得分:0)

您只需要告诉服务器有关页面的更多信息,包括页面的位置。可以使用<%@ Page >标签来完成此操作,该标签必须插入页面的开头,如下所示:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="PublicView.aspx.cs" Inherits="WebApplication1.Public.PublicView" %>

如果您创建的页面是母版页(看起来像是在其中拥有<head>标记,则在创建新页面时必须使用Master并选择适当的文件类型)页面:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="PublicView.master.cs" Inherits="PublicView.SiteMaster" %>

答案 2 :(得分:0)

这是我的解决方案。工作正常希望对您有帮助,我的朋友:))

1)配置路由信息:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
            routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
            routes.IgnoreRoute("{resource}.aspx");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

2)在控制器中调用操作:

public class PublishController : Controller
    {
        // GET: Publish
        public ActionResult Index()
        {
            return View("WebForm1");
        }        
    }

3)在网络表单后面的代码中:

public partial class WebForm1 : System.Web.Mvc.ViewPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                //Your code here
            }
        }
    }