' /'中的服务器错误在ActionLink中的应用程序(但提交工作正常)

时间:2014-11-03 20:24:15

标签: asp.net-mvc asp.net-mvc-4 razor

执行以下行

@Html.ActionLink("Open",actionName: "DownloadExcelFile", 
                        controllerName: "Excel", 
                        routeValues: new { model = new ExcelModel(5, "JobName", "item.UserName") },
                        htmlAttributes: null)

在'/'应用中返回服务器错误,你能帮我解决一下吗?

请注意,当我更改参数名称时,模型 - > ID ,我在中得到错误404 而不是服务器错误。

模型

public class ExcelModel
{
    public int InputA { get; set; }
    public string InputB { get; set; }
    public string UserName { get; set; }
    public ExcelModel(int inputA, string inputB, string userName)
    {
        InputA = inputA;
        InputB = inputB;
        UserName = userName;
    }
    public ExcelModel()
    {
        InputA = 1;
        InputB = "B1";
        UserName = "NiceUser";
    }
    ...
}

控制器

public class ExcelController : Controller
{
    public ActionResult Index()
    {
        var model = new ExcelModel(1, "B1", User.Identity.Name);
        return View(model);
    }
    [HttpPost]
    public ActionResult DownloadExcelFile(ExcelModel id)
    {
        // assume we create an an excel stream...
        MemoryStream excelStream = id.BuildSpreadsheet();

        return new FileStreamResult(excelStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
        {
            FileDownloadName = "myfile.xslx"
        };
    }
}

RouteConfig 是标准的

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

最后,如前所述,该方法本身很好,因为它与提交完美配合,如下所示:

@using (Html.BeginForm("DownloadExcelFile", "Excel"))
{
    <fieldset>
        // fields names and values
        <p>
            <input type="submit" value="Open Excel"/>
        </p>
    </fieldset>     
}

2 个答案:

答案 0 :(得分:1)

您的控制器方法标有HttpPost属性。这意味着它只接受POST请求而不接受GET请求。正常链接访问是GET请求,因此可能是问题。 (Read more here

删除HttpPost属性,看看是否能解决问题。

答案 1 :(得分:1)

1)您不能将整个类作为路由值参数传递。帮助程序必须能够将您传递的任何内容放入URL中,这意味着它必须是可以转换为字符串值的东西。有可能对模型进行JSON编码,然后为param传递JSON字符串,但是帮助程序不会为您做出这样的假设,也不一定知道 如何对JSON进行编码对你来说,如果有的话。

2)当你刚刚传递id时,你会得到一个404,因为你的动作不接受id的int,而是期望ExcelModel,正如我们在#1中所讨论的那样,无法通过网址传递。