繁体   English   中英

从查询字符串获取参数

[英]Getting parameters from query string

我正在使用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的“ ClientEdit”控制器。

因此,在我的剔除视图模型中,我的剔除单击事件看起来像这样:

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://本地主机:49389 /管理/ 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”?),这是否是实现我想做的正确方法?

您可以通过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

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

var id = GetID();

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

我已经提出了可以使用的解决方案,但是我不确定这是否是最好的方法。 好像还不错

我在应用程序代码中创建了一个MVC ViewModel类,称为“ GenericParameteModel”,该类目前具有单个参数“ 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加载后获取数据)。 但这看起来很整洁且易于管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM