【问题标题】:Server error in application '/'. HTTP 404. MVC ASP.NET应用程序“/”中的服务器错误。 HTTP 404。MVC ASP.NET
【发布时间】:2020-10-18 15:42:51
【问题描述】:

我正在尝试通过 POST 操作方法显示视图,但在调用此操作时它会显示消息 "Server error in application '/'"

The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) may have been removed, renamed, or temporarily unavailable. Please review the URL below and make sure it is spelled correctly.

我已经使用routes.MapMvcAttributeRoutes()为此方法创建了我各自的视图。

     [Route("Home/AddPiloto")]
     [Route("AddPiloto")]
     public ActionResult AddPiloto()
     {
         return View();
     }

这是我从 html 表单调用的 POST 操作,该方法有效并获取数据,only the view fails.

    [HttpPost]
    public ActionResult AddPiloto(PilotoClass pclass)
    {
        HttpClient httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri("http://localhost:8080/AeronauticaDGAC/");
        var request = httpClient.PostAsync("webresources/conndatabase.piloto/supCreatePost", pclass,
            new JsonMediaTypeFormatter()).Result;
        if (request.IsSuccessStatusCode)
        {
            var resultString = request.Content.ReadAsStringAsync().Result;
            var succes = JsonConvert.DeserializeObject<bool>(resultString);
            ViewBag.Mg = succes;
            return RedirectToAction("AddPiloto");
        }
        ViewBag.Mg = request.StatusCode;
        return RedirectToAction("Index",ViewBag);
    }

最后在这里我有一个调用这个方法的典型表单POST

        <form action="AddPiloto" method="post">
            <div class="form-group">
                <input class="form-control" type="number" name="id" value="" placeholder="Id" />
                <input id="inp1" class="form-control" type="text" name="nombre" value="" placeholder="Nombre" />
                <input id="inp1" class="form-control" type="text" name="apellido" value="" placeholder="Apellido" />
                <input id="inp1" class="form-control" type="number" name="edad" value="" placeholder="Edad" />
                <hr />
                <input class="btn btn-primary" type="submit" name="button" value="Enviar" />
                <input onclick="limpiarFormulario1()" class="btn btn-danger" type="button" name="button" value="Limpiar" />
            </div>
        </form>

我已经创建了视图,compilerecompile 解决方案,clear the browser cachecheck if the file existsrestart the IIS server,但是对我没有任何用处,如果有人知道任何可能的解决方案,我将不胜感激. 提前致谢。

All code.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net.Http;
using Newtonsoft.Json;
using AeronauticaClient.Models;
using System.Net.Http.Formatting;

namespace AeronauticaClient.Controllers
{
    [RoutePrefix("Home")]
    [Route("{action}")]
    public class HomeController : Controller
    {
        [Route("~/")]
        [Route("")]
        [Route("Index")]
        [HttpGet]
        public ActionResult Index()
        {
            System.Net.Http.HttpClient CHttp = new HttpClient();
            CHttp.BaseAddress = new Uri("http://localhost:8080/AeronauticaDGAC/");
            var request = CHttp.GetAsync("webresources/conndatabase.piloto/supFindAllGet").Result;
            if (request.IsSuccessStatusCode)
            {
                var resultString = request.Content.ReadAsStringAsync().Result;
                var listado = JsonConvert.DeserializeObject<List<PilotoClass>>(resultString);
                ViewBag.Message = request;
                return View(listado);
            }
            else
            {
                ViewBag.Message = request;
            }
            return View();
        }
        
        [Route("Home/AddPiloto")]
        [Route("AddPiloto")]
        public ActionResult AddPiloto()
        {
            return View();
        }
        
        [HttpPost]
        public ActionResult AddPiloto(PilotoClass pclass)
        {
            HttpClient httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri("http://localhost:8080/AeronauticaDGAC/");
            var request = httpClient.PostAsync("webresources/conndatabase.piloto/supCreatePost", pclass,
                new JsonMediaTypeFormatter()).Result;
            if (request.IsSuccessStatusCode)
            {
                var resultString = request.Content.ReadAsStringAsync().Result;
                var succes = JsonConvert.DeserializeObject<bool>(resultString);
                ViewBag.Mg = succes;
                return RedirectToAction("AddPiloto");
            }
            ViewBag.Mg = request.StatusCode;
            return RedirectToAction("Index",ViewBag);
        }
    }
}

Routing code.

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapMvcAttributeRoutes();
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

【问题讨论】:

  • Action 方法你用的是什么两个Route?
  • 显示您向控制器发送请求的代码
  • 应该不会影响视图的搜索,是同一个路由。它在同一个控制器中。
  • 那里我添加了所有的控制器代码

标签: c# asp.net-mvc visual-studio asp.net-core


【解决方案1】:

当您重定向到索引时,您将 ViewBag 作为参数传递。

return RedirectToAction("Index",ViewBag);

但服务器找不到接收该参数的索引方法,因此引发异常。

  1. 在重定向时删除 ViewBag 作为参数。

    return RedirectToAction("Index");
    
  2. 在重定向之前,将ViewBag 替换为TempData

     if (request.IsSuccessStatusCode)
     {
         var resultString = request.Content.ReadAsStringAsync().Result;
         var succes = JsonConvert.DeserializeObject<bool>(resultString);
         TempData["Mg"] = succes;
         return RedirectToAction("AddPiloto");
     }
     TempData["Mg"] = request.StatusCode;
     return RedirectToAction("Index");
    
  3. 要检索您在上一步中存储的值,请继续使用TempData["Mg"]

您需要TempData,因为在RedirectToAction 之后,您将进入一个新请求。由于ViewBag只对同一个请求有效,重定向后值会丢失。

【讨论】:

  • 视图已显示,但现在问题是 URL,根据 [RoutePrefix ("Home")][Route ("Home / AddPiloto")][Route ("AddPiloto")],URL 应该是 http: // localhost: 57796 / Home / Addpilot 但让我用 http: // localhost: 57796 / Home / Home / Addpilot 看看,double HOME,路线错了吗?
  • 我编辑了帖子并在最后添加了路由代码,谢谢。
  • 您的RouteConfig 类应该完成这项工作,包括将 Home 指向默认控制器,将 Index 指向默认操作。我不明白在控制器类中包含所有这些 RouteRoutePrefix 有什么意义。
  • 尝试从 HomeController 类中删除 [RoutePrefix("Home")]。这可能会将额外的“主页”添加到 Url。
  • 出于某种原因,我不得不将控制器名称添加到表单的 action="controller/action" 并删除路由。谢谢!
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多