【问题标题】:'Details' in asp.net mvc routing doesn't seem to get removedasp.net mvc 路由中的“详细信息”似乎没有被删除
【发布时间】:2010-05-06 05:08:13
【问题描述】:

我正在尝试从 http://localhost:1985/Materials/Details/2/Steel 中删除 Details,但我的路线似乎不起作用...

编辑:

 routes.MapRoute(
             "Materials", // <-- Above default
             "Materials/{id}/{name}",
             new { controller = "Materials", action = "Details", id = "", name = "" }
         );

        routes.MapRoute(
            "Default", // <-- Last route, kind of a "catch all"
            "{controller}/{action}/{id}/{name}",
            new { controller = "Materials", action = "Index", id = "", name = "" }
        );

将下面的答案放在我的路由集合中,我的索引页面无法调用 jsonresult 控制器方法....

  public class MaterialsController : Controller
  {
   public ActionResult Index()
    {
        return View("Materials");
    }

    public JsonResult GetMaterials(int currentPage,int pageSize)
    {
        var materials = consRepository.FindAllMaterials().AsQueryable();
        var count = materials.Count();
        var results = new PagedList<MaterialsObj>(materials, currentPage-1, pageSize);
        var genericResult = new { Count = count, Results = results };
        return Json(genericResult);
    }
   }

我的索引页面有一个使用 json 结果的 jquery 函数......

<script type="text/javascript">
$(document).ready(function() {
  $.ajax({
   url: "Materials/GetMaterials",
    data: {'currentPage': (currentPage + 1) ,'pageSize':5},
    contentType: "application/json; charset=utf-8",

这个jquery函数好像没有调用jsonresult控制器方法……但是如果我先指定Default路由就可以了……

当通过萤火虫检查时,它会显示这一点,

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'CrMVC.Controllers.MaterialsController'. To make a parameter optional its type should be either a reference type or a Nullable type.&lt;br&gt;Parameter name: parameters

【问题讨论】:

标签: asp.net-mvc url-routing detailsview


【解决方案1】:

你的路线是倒退的。它们是matched,按照它们添加到集合中的顺序排列,所以首先匹配Default路由。


编辑

routes.MapRoute(
    "Materials",
    "Materials/{id}/{name}",
    new { controller = "Materials", action = "Details", id = "", name = "" },
    new {id= @"\d+" } // Prevent routes in the form of {controller}/{action}/{id} from matching.
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}/{name}",                          
    new { controller = "Materials", action = "Index", id = "" ,name=""} 
);

【讨论】:

  • @Pandiya Chendur:添加了我所说的“你的路线是向后的”的示例。 HTH
  • @Pandiya Chendur:所以索引操作失败的原因是因为现在第一条路线匹配所有内容。基本上它无法区分Materials/123/some-nameMaterials/Index/123/some-name。我链接到的文章通过为 routes =(. 指定不同的前缀来解决这个问题
  • @Pandiya Chendur:您可以尝试创建这样的路由约束,以确保 ID 仅匹配数字(或您的 ID 恰好是)asp.net/mvc/tutorials/creating-a-route-constraint-cs
【解决方案2】:

尝试使用 routelink 帮助器为该请求生成正确的 URL,这样您就可以检查它是否完全正确,然后在您的 JavaScript 中使用该 URL。可能是您的 URL 不完全正确,从而导致了问题。

您可以使用 routelink 帮助器将 URL 放在链接上,只是为了获取它并查看它的外观 - 然后将其与 AJAX 请求中的实际 URL 进行比较。

【讨论】:

  • 在您的视图中,您键入“Html.RouteLink(”,它会提示您输入详细信息。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 2021-09-14
  • 2017-05-17
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多