代码之家  ›  专栏  ›  技术社区  ›  esbenr

带有绑定前缀的ASP.NET MVC操作参数与global.asax中的url.route不兼容

  •  0
  • esbenr  · 技术社区  · 14 年前

    我有一个包含名为userid的表单字段的详细信息页面。在同一个页面上,我有另一个搜索表单,其中包含一个名为userid的字段。

    我在两个不同的视图模型上使用html.labelfor(vm>vm.userid)和html.textbox for(sm>sm.userid),vm是视图模型,sm是搜索模型。(是的,两个模型上的userid属性具有相同的名称-因为它们是相同的域属性。

    当我导航到该页面时,VM上填充的用户ID被插入到MVC命名为userid的两个表单字段中。甚至sm.userid也是空的。

    这是我最初的问题。我有几种方法可以避免这种情况。我的解决方案是为SM使用前缀标志。

    [HttpGet]
        public ActionResult Search([Bind(Prefix = "Search")] SearchFormViewModel searchFormViewModel, PagingViewModel pagingViewModel)
        {
    

    这将激发MVC在搜索表单中的字段名上呈现search.userid,但代码中的属性仍将命名为userid。

    这个解决方案似乎效果很好!

    但是: 现在,我必须在global.asax的一个路由上找到search.userid。 我画的路线是这样的:

     routes.MapRoute(
                "MyRouteName",
                "ControllerName/User/{Search.UserId}",
                new { controller = "ControllerName", action = "Search" }
                );
    

    我的问题是,MVC无法将search.userid(因为)映射为适合上面所示操作中的userid(前缀为search)。

    因此,MVC似乎有一个前缀功能,实际上通过路由处理程序完全支持它。

    当然,我可以将search.userid重命名为search_userid,但是名称dosent与上面receiving操作中MVC期望的名称匹配。(expects search.userid)重命名搜索模型的userid属性可以解决此问题,但由于它在域中的值相同,因此这似乎是一种解决方法。

    我是否遗漏了前缀功能的用法,或者这是不可能的?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Will Dean    14 年前

    <a href="<%: Url.RouteUrl("MyRouteName", new { Search.UserId = Model.UserId } ) %>" target="_blank">See the user</a>
    

    • <a href="<%: Url.RouteUrl("MyRouteName", new RouteValueDictionary(new Dictionary<string, object>(){ "Search.UserId", Model.UserId })) %>" target="_blank">See the user</a>