如何更正运行控制器操作所产生的路由

本文关键字:路由 操作 何更正 运行 控制器 | 更新日期: 2023-09-27 18:27:18

下面是一个非常简单的MVC三元组,用于尝试。

除了在将状态代码更改为500并点击Submit按钮后得到的URL是Error/StatusCode,而不是Error/StatusCode/500之外,它似乎还能工作。我该怎么改?

我很感激这是一个简单的问题,但我找不到正确的关键词来搜索答案。

型号

public class ErrorModel
{
    [DisplayName("Status Code")]
    public string StatusCode { get; set; }
    public ErrorModel(string statusCode)
    {
        HttpStatusCode code;
        if (! Enum.TryParse(statusCode, out code))
        {
            code = HttpStatusCode.NotFound;
        }
        StatusCode = ((int)code).ToString();
    }
    public ErrorModel(HttpStatusCode statusCode = HttpStatusCode.OK)
    {
        StatusCode = ((int)statusCode).ToString();
    }
}

查看

@using WebApplication1.Models
@model WebApplication1.Models.ExcelModel
@using (Html.BeginForm("StatusCode", "Error", FormMethod.Post))
{
    <p>
        <div class="editor-label">
            @Html.LabelFor(model => model.StatusCode)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.StatusCode, null, "id")
        </div>
        <input type="submit" value="Submit" />
    </p>
}

控制器

public class ErrorController : Controller
{
    static readonly List<HttpStatusCode> ErrorCodes = new List<HttpStatusCode>(){
        HttpStatusCode.Unauthorized, HttpStatusCode.Forbidden, HttpStatusCode.NotFound, HttpStatusCode.InternalServerError};
    public ActionResult StatusCode(string id)
    {
        ViewBag.Message = "";
        if ((id == null) || (ErrorController.AreEqual(HttpStatusCode.OK, id)))
        {
            return View("StatusCode", new ErrorModel(HttpStatusCode.OK));
        }
        foreach (HttpStatusCode errorCode in ErrorCodes)
        {
            if (ErrorController.AreEqual(errorCode, id))
            {
                return View("HttpError", new ErrorModel(errorCode));
            }
        }
        ViewBag.Message = "Exception " + id
            + @" is not supported, see https://msdn.microsoft.com/en-us/library/system.net.httpstatuscode(v=vs.110).aspx for further details";
        return View("HttpError", new ErrorModel(HttpStatusCode.InternalServerError));
    }
    static private bool AreEqual(HttpStatusCode httpCode, string statusCode)
    {
        return (statusCode == ((int)httpCode).ToString());
    }
}

如何更正运行控制器操作所产生的路由

您正在使用POST方法提交表单。这不会在url中包括表单元素值,而是在请求正文中。

如果希望表单字段值成为URL的一部分,请将表单方法更改为GET。使用GET时,如果发布了表单,则发送到服务器的数据会作为查询字符串值附加到URL中。

@using (Html.BeginForm("StatusCode", "Error", FormMethod.Get))
{   
    <div class="editor-label">
        @Html.LabelFor(model => model.StatusCode)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.StatusCode, null, "id")
    </div>
    <input type="submit" value="Submit" />      
}

现在,当用户提交表单时,浏览器将向Error/StatusCode url发出GET请求,并将表单数据附加到url中。

/Home/StatusCode?id=500

动态更改操作的url可能是一种解决方案,下面的代码显示了一种最简单的方法。

<script>
    $(document).ready(function() {
        $('form').submit(function(){
            this.action = this.action  + '/' + $('#StatusCode').val();
        })
    });
</script>