从查询字符串中获取参数
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 加载后获取数据)。但它看起来整洁且易于管理。
【讨论】:
以上是关于从查询字符串中获取参数的主要内容,如果未能解决你的问题,请参考以下文章