2015-12-18 14 views
3

下面是一个非常简单的MVC三元组,用于实现这些功能。如何更正运行控制器操作导致的路由?

它似乎工作,除了我更改状态代码后说的500和点击提交按钮Error/StatusCode而不是Error/StatusCode/500后得到的URL。我该如何改变它?

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

型号

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()); 
    } 

} 
+0

您可以使用jquery ajax将数据作为路由值发送到服务器。 –

+1

您在提交时发布 - 不包含网址中的代码,仅包含基本路线。 – dbugger

+0

@AbbasAmiri,你可以添加一个答案和一个片段吗? –

回答

1

您正在使用POSTmethod提交表格。这不会包含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" />  
} 

现在,当用户提交表单时,浏览器将发出GET请求Error/StatusCode网址添加到URL表单数据。

/Home/StatusCode?id=500 
1

动态更改动作的URL可能是一个解决方案,下面的代码显示了一个最简单的方法来做到这一点。

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