【问题标题】:Get third parameter in asp.net MVC获取asp.net MVC中的第三个参数
【发布时间】:2016-11-22 11:46:00
【问题描述】:

我有一个 asp.net MVC 网站,我有这个网址:

Home/Index/

我想要执行一项操作,目前我正在使用查询字符串执行此操作,如下所示:

Home/Index/?action=1

然后我将使用 Request.QueryString["action"] 在我的代码中获取它。

但这看起来不像它应该的那么好,我想要这样的东西:

Home/Index/Action

所以查询字符串将是第三个参数。我怎样才能这样使用它并检查第三个参数是否存在,以及它的名称?

我的路线是这样配置的:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

我是否需要更改路线上的任何内容,或者我可以输入我想要的方式,如果需要,我如何检索此值?


编辑:

好的。我想做的是根据这个参数在视图中产生不同的结果。

我现在所做的是创建两个 ActionResults,它们使用相同的 View 向 ViewData 发送不同的值。

【问题讨论】:

标签: c# asp.net asp.net-mvc routes


【解决方案1】:

在 MVC 中有模型绑定的概念,其中使用参数的名称,然后用表单中的值填充,而无需您这样做。

如果你这样写你的 Action 方法:

public ActionResult Index(int action)
{ ... }

那么它已经适用于/Home/Index?action=1

如果您希望能够像/Home/Index/1 一样调用它,那么最简单的方法就是简单地编写 Action 方法,如下所示:

public ActionResult Index(int id)
{ ... }

这是可行的,因为MapRoute 定义基本上是说'如果在 {action} 部分之后有什么东西(在这种情况下是“索引”,顺便说一下),然后给它参数名称 {id} 并绑定我的 Action 方法的 {id} 参数”。


更新
both 调用场景中使用名为 action 的参数的问题在于 {action} 是 MVC 中的特殊关键字。
要在两种调用场景中使用MySpecialParam,您只需添加此路由:

routes.MapRoute(
    name: "Default_MySpecialParam",
    url: "{controller}/{action}/{MySpecialParam}",
    defaults: new { controller = "Home", action = "Index", MySpecialParam = UrlParameter.Optional }
);

但是,如果 MySpecialParam 变为 action,则存在 MVC 可能不知道如何处理的名称解析冲突,或者它可能甚至抛出错误。

【讨论】:

【解决方案2】:

通常,该操作应该在控制器之后。我认为在您的情况下,添加一个具有您想要的操作的新控制器可能会更好。

【讨论】:

  • 问题是,我需要使用相同的视图。如果我有两个使用相同视图并传递相似数据的操作,您认为这会更好吗?
【解决方案3】:

我放弃了映射路线,因为这很麻烦。您需要为每个参数数量添加一个新路由,如下所示:

routes.MapRoute(
        "ThreeIds",                                  // Route name
        "{controller}/{action}/{firstId}/{secondId}/{thirdId}" // URL with parameters

        );

routes.MapRoute(
        "Dates",                                // Route name
        "{controller}/{action}/{startDate}/{endDate}"      // URL with parameters

        );

尝试使用 jQuery 之类的东西来进行 ajax 调用。无需为每种可能性添加路线。

$.ajax({
            url: '../' + controller + '/' + method,
            data: jsonObjectString,
            contentType: 'application/json',
            dataType: 'json',               
            success: function (data) {
                //do something
            },
            error: function (err) {
               //do something
            }
        });

您可以在https://github.com/Biot-Savart/MVC-DataCall.js 使用我的图书馆,让生活更轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2017-01-13
    • 2019-08-31
    相关资源
    最近更新 更多