由于子请求失败,Html.RenderAction引发System.Web.HttpException

时间:2018-01-12 11:31:42

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在尝试在ASP.NET MVC中创建注册页面,但特别是有一个字段存在问题。 "国家"字段,我的目的是从本地存储的JSON文件中读取国家并呈现局部视图(仅包含下拉框)。但是,当我运行代码并尝试导航到注册页面时,我收到以下错误消息:

  

类型' System.Web.HttpException'的例外情况发生在System.Web.dll中但未在用户代码中处理

     

其他信息:执行子请求失败。请查看InnerException以获取更多信息。

仔细观察异常,我看到以下内容:

  

$ exception {"执行子请求失败。请查看InnerException以获取更多信息。"} System.Web.HttpException

     

InnerException {"路径控制器' /帐户/注册'未找到或未实现IController。"} System.Exception {System.Web.HttpException}

以下是代码:

部分视图

using MyWatch.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyWatch.Controllers
{
    public class CountrySearchController : Controller
    {
        [HttpGet]
        [ChildActionOnly]
        public ActionResult CountrySearch()
        {
            try
            {
                using (StreamReader streamReader = new StreamReader("C:\\Users\\Alex Combe\\Documents\\Visual Studio 2015\\Projects\\MyWatch\\MyWatch\\App_Data\\CountryList.json"))
                {
                    string json = streamReader.ReadToEnd();
                    Countries countries = new Countries();
                    countries.countries = JsonConvert.DeserializeObject<IList<Country>>(json);
                    return PartialView(countries);
                }
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(e.StackTrace);
                return View(new Countries());
            }
        }
    }
}

主视图

<div class="form-group">
    @Html.LabelFor(m => m.Country, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @*@{Html.RenderAction("CountrySearch", "Search");}*@
        @{Html.RenderAction("CountrySearch", "Search");}
    </div>
</div>

部分视图控制器

namespace MyWatch.Controllers
{
    public class CountrySearchController : Controller
    {
        [HttpGet]
        [ChildActionOnly]
        public ActionResult CountrySearch()
        {
            try
            {
                using (StreamReader streamReader = new StreamReader("C:\\Users\\Alex Combe\\Documents\\Visual Studio 2015\\Projects\\MyWatch\\MyWatch\\App_Data\\CountryList.json"))
                {
                    string json = streamReader.ReadToEnd();
                    Countries countries = new Countries();
                    countries.countries = JsonConvert.DeserializeObject<IList<Country>>(json);
                    return PartialView(countries);
                }
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine(e.StackTrace);
                return View(new Countries());
            }
        }
    }
}

部分视图模型

namespace MyWatch.Models
{
    public class Country
    {
        public string name { get; set; }
        public string code { get; set; }
    }

    public class Countries
    {
        public string SelectedItem { get; set; }
        public IList<Country> countries;
    }
}

2 个答案:

答案 0 :(得分:1)

此处的问题是在主视图中调用Html.RenderAction。查看MSDN documentation for RenderAction,我们希望我们传递ActionMethod名称和Controller名称:

public static void RenderAction(
    this HtmlHelper htmlHelper,
    string actionName,
    string controllerName = null,
    object routeValues = null
)

如上所述,您的RenderAction调用正在为controllerName参数传递“搜索”,但您的控制器名称为CountrySearch,导致路由失败并出现此异常。

有两种方法可以解决此问题,但最简单的方法是更新RenderAction来调用正确的Controller名称,如下所示:

@{Html.RenderAction("CountrySearch", "CountrySearch");}

答案 1 :(得分:0)

尝试删除[HttpGet]。根据这篇文章Link。 [HttpGet]只允许获取请求,但如果有帖子请求,则无法找到该方法。