从查询字符串中获取参数

Posted

技术标签:

【中文标题】从查询字符串中获取参数【英文标题】:Getting parameters from query string 【发布时间】:2017-12-09 14:55:17 【问题描述】:

我正在使用 ASP.Net WebAPi、MVC 和 Knockout 创建网页。

我有一个普通的 MVC 控制器,可以在需要时加载页面:

 [Authorize]
    public class AdminController : Controller
    
        public ActionResult Clients()
        
            return View();
        

        public ActionResult ClientEdit(int? Id)
        
            return View();
        
    

一旦页面加载完毕,我的 Knockout 模型就会负责数据的加载。因此,“客户端”控制器只是加载所有客户端的列表。在该屏幕上,用户可以单击客户端旁边的“编辑”,然后页面将导航到“客户端编辑”控制器,该控制器需要一个 id。

所以,我的淘汰赛点击事件在淘汰赛视图模型中如下所示:

self.EditClick = function () 
        if (this.ClientId && typeof this.ClientId !== 'undefined') 
            window.location.href = "/Admin/ClientEdit/" + this.ClientId;
        
        else
            window.location.href = "/Admin/ClientEdit/";
    

(它处理“新建”按钮和编辑按钮,因此是“如果”)

一旦我重定向,MVC 控制器就会加载页面,并且 URL 是:

http://localhost:49389/Admin/ClientEdit/1

然后我加载淘汰模型,并想进行 API 调用以获取数据...

页面加载后,我想将视图模型绑定到页面。这是我目前的视图模型:

function AdminClientEditor() 
    var self = this;

    self.Name = ko.observable("");
    self.ContactName = ko.observable("");

ko.applyBindings(new AdminClientEditor(), $("#clienteditor")[0]);

因此,我将创建一个 $.get 方法,该方法调用一个 webAPI 方法,该方法将根据 id 返回数据。我只需要以某种方式获取 ID。

但是,我如何从 URL 中获取 ID(在本例中为“1”? 而且,这是实现我想要做的事情的正确方法吗?

【问题讨论】:

【参考方案1】:

你可以通过viewbag传递id值来查看。

public ActionResult ClientEdit(int? Id)

     ViewBag.ClientId=id;
     return View();

在视图的脚本部分

var clientId="@ViewBag.ClientId";
alert(clientId);
// use this

如果访问此 id 值的 javascript 代码位于单独的外部 js 文件中,则可以将此值设置为视图中的 js 变量并在 js 文件中访问它。确保使用命名空间以避免全局变量覆盖值问题。

所以在你看来

<script>
    var myApp = myApp || ;  
    myApp.ClientId= "@ViewBag.ClientId";
</script>
<script src="~/Scripts/PageSpecificExternalJsFile.js"></script>

PageSpecificExternalJsFile.js 文件中,

var clientId=myApp.ClientId;
//use this as needed

【讨论】:

这只是提醒“@ViewBag.ClientId” 它在剃刀视图内吗? 它在 javascript 淘汰视图模型中。我已经使用该视图模型编辑了帖子。代码需要进入那里。当我尝试您的示例时,它只是提醒代码,而不是获取 id。【参考方案2】:

我不确定这是否是最好的方法,但是您可以使用 JS 从 URL 中获取 ID:

var id = GetID();

function GetID() 
  var href = location.href;
  var results = href.split("/");
  return results[results.length - 1];

【讨论】:

【参考方案3】:

我想出了这个可行的解决方案,但我不确定它是否是最好的方法。看起来还不错。

我在我的应用程序代码中创建了一个名为“GenericParameteModel”的 MVC ViewModel 类,目前它只有一个参数“Id”。

然后我修改了我的页面加载MVC方法:

public ActionResult ClientEdit(int? Id)

     var mv = new GenericParameteModel  Id = Id ;
     return View(mv);

在我的视图页面上,我将模型 'GenericParameteModel' 添加到视图中。

我在视图上创建了一个隐藏字段,名为'ClientId'

<input type="hidden" id="clientId" value="@model.Id">

然后,在我的淘汰视图模型中,我检查 $("#clientId").val() 是否有值。如果是这样,我会使用该值调用 $.get,然后填充我的视图模型。

这样做时,我从 MVC 加载的所有初始页面都将能够为您提供 GenericParameteModel,并且它将成为其他页面的模式。由于它是一个模型,我可以根据应用程序的需要添加新字段。

这似乎运作良好。我不确定这是否是一种可接受的方式,因为我是新手(MVC 加载视图和 Knockout/WebApi 加载后获取数据)。但它看起来整洁且易于管理。

【讨论】:

以上是关于从查询字符串中获取参数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MVC Razor 标记中获取查询字符串参数?

从 Google adwords 获取活动查询字符串参数

如何在 NextJS 中间件中获取查询字符串参数

从 Uri 获取单个查询参数 [重复]

从URL获取查询字符串参数

[JAVASCRIPT]从url查询字符串获取参数