覆盖方法 asp.net mvc

Posted

技术标签:

【中文标题】覆盖方法 asp.net mvc【英文标题】:overriding Method asp.net mvc 【发布时间】:2011-02-11 19:27:27 【问题描述】:

我可以重写 ActionResult 方法吗?假设我在 AccountController 中有一个方法 Index 这样的

公共行动结果索引()

返回视图();

我可以再多一种方法名称相同但参数不同吗 喜欢 公共 ActionResult 索引(int userid)

返回视图();

我不想这样称呼它http://something/accounts/index/11 我只想说http://something/accounts/11

你也可以看看 *** 的东西 如果你去https://***.com/users 我觉得用户是控制器,默认操作是索引,所以不要显式地调用它。 现在如果你输入类似https://***.com/users/96346/parminder 两个参数分别是96346和parminder

我希望这是有道理的。

global.asax 中的条目是什么

问候 帕尔米德

【问题讨论】:

【参考方案1】:

你可以做动作重载(两个动作在同一个控制器上使用不同的参数),但它们应该可以在不同的 HTTP 动词上调用。这是 ASP.NET MVC 应用程序中的一种常见模式:一个可通过 GET 访问的操作,该操作呈现一个包含表单的视图,另一个操作是该表单将发布到的:

public class HomeController: Controller

    public ActionResult Index()
    
        return View();
    

    [HttpPost] // [AcceptVerbs(HttpVerbs.Post)] for ASP.NET MVC 1.0
    public ActionResult Index(SomeViewModel model)
    
        if (ModelState.IsValid)
        
            // TODO: validation passed => do something with the model
        
        return RedirectToAction("index");
    

无需为此修改您的路线,它适用于默认路线。

【讨论】:

谢谢达林,我知道这些东西。但要求不同。问候【参考方案2】:

看看我的问题here

我认为你可以通过修改一些方法属性来做到这一点,但我认为如果你编写另一个方法然后为其添加路由会更简洁。它看起来像这样:

public ActionResult Index()

    return View();
 

public ActionResult UserInfo(int id)

    //some stuff
    return View(modelObject);

然后你为它提供一条路线,例如:

routes.MapRoute("UserInfo", //route name
                "Accounts/id",
                new 
                 
                    controller = "Accounts",
                    action = "UserInfo",
                    id=UrlParameter.Optional 
                );

【讨论】:

嗨纳西尔,感谢您的回答。我试过这种方法。但我不能这样称呼我的方法something/accounts/1 它不能那样工作。是的,如果我写accounts/userinfo/1 谢谢 如果你正确映射了路由,你可以直接从 accounts/3 调用你的方法。你能发布你的 Global.asax 吗? 您好 Narsil,我删除了默认路由。这是我的 global.asax routes.IgnoreRoute("resource.axd/*pathInfo"); routes.MapRoute("UserInfo", //路由名称 "Users/id/name", new controller = "Users", action = "UserInfo", id = UrlParameter.Optional, name = UrlParameter.Optional );这是控制器方法 public ActionResult UserInfo(int? id, string name) return View(); 现在可以使用了,谢谢【参考方案3】:

您想过度加载该方法。但你不需要。

只要让参数可以为空:

public ActionResult Index(int? userid)

   return (userid.HasValue) ? ShowUser(userid.Value) : ShowOverview();

本例可以采用默认路由图。

对于您(更改的)要求,您确实需要使用约束来修改您的路线。

routes.MapRoute("directaccount", "Accounts/userid/someotherparam",
    new  controller="Accounts", action="ShowAccountByID", someotherparam=null 
    new  userid=@"\d+");

*here goes the rest*

reg-ex 确保您的其他呼叫不会被此路由吃掉。这是未经测试的。我不建议为此功能使用重载。

【讨论】:

您好 Wikser,非常感谢您的回答。默认索引有效,但是当我必须传递参数时,我不得不说something/accounts/index/1 我不想这样做。问候

以上是关于覆盖方法 asp.net mvc的主要内容,如果未能解决你的问题,请参考以下文章

使用 jscript 和控制器操作将数据添加到使用 MVC ASP.net 的数据库

如何在 MVC ASP.NET 中的手机号码前添加默认(默认为浏览器国家)国家代码?

配置 antiforgerytoken 单次使用 mvc asp.net

我如何根据 mvc asp.net 中的登录用户切换视图

在 MVC ASP.Net 中将插件添加到部分视图选择列表

使用 MEF 构建具有 n 层松散耦合的 MVC ASP.NET 应用程序