Вновь созданная веб-форма в папке не найдена ошибка - PullRequest
0 голосов
/ 18 января 2019

Я делаю проект в ASP.NET MVC, идея в том, чтобы создать независимые представления, для этого я создал общую папку, и внутри нее я создал WebForm.aspx со своим собственным кодом позади .aspx.cs. Я установил Bootstrap из упаковщика NuGet, ссылался на скрипты в WebForm следующим образом:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <link href="../../Content/bootstrap.min.css" rel="stylesheet" />
        <script src="../../Scripts/bootstrap.min.js"></script>
        <script src="../../Scripts/jquery-3.3.1.min.js"></script>
        <script src="../../Scripts/popper.min.js"></script>
    </head>
    <body>
        <form id="form1" runat="server">
            <div class="container-fluid">
                <h1>My First Bootstrap Page</h1>
                <p>This is some text.</p>
            </div>
        </form>
    </body>
    </html>

но когда я запускаю его, он показывает ошибку:

enter image description here

это структура:

enter image description here

но когда я запускаю его из веб-формы, созданной из папки, он работает правильно.

enter image description here

Как заставить работать aspx, находящийся внутри публичной папки?

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вот мое решение. Работает. Надеюсь на помощь, дружище :))

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
            }
        }
    }
0 голосов
/ 22 января 2019

Страница HTTP 404 указывает, что имя метода действия контроллера PublicView не существует в определении контроллера. Если вы хотите связать страницу веб-форм со стилем пути маршрутизации 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 }
    );
}

Если вы хотите отобразить все страницы ASPX в папке с одним MapPageRoute, настройте его так, чтобы он содержал заполнитель имени страницы:

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 следующим образом:

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

Затем замените серверные элементы управления webforms на HTML-помощники MVC перед вызовом страницы из контроллера, как указано ниже:

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

2) Избегайте замены пространства имен с System.Web.UI.Page на System.Web.Mvc.ViewPage для страниц ASPX в коде позади, поскольку это может вызвать несколько проблем при использовании серверных элементов управления.

Справка: Как определить маршруты для приложений Web Forms

0 голосов
/ 22 января 2019

Вам нужно только сообщить серверу больше информации о вашей странице, включая ее местоположение. Это можно сделать с помощью тега <%@ 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" %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...