从查询字符串

时间:2017-07-05 19:40:49

标签: javascript jquery asp.net asp.net-mvc knockout.js

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

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

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

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

加载页面后,我的Knockout模型负责加载数据。所以,'客户' controller只需加载所有客户端的列表。在该屏幕上,用户可以点击'编辑'在客户端旁边,该页面将导航到' ClientEdit'控制器,取一个id。

所以,我的淘汰赛点击事件在我的淘汰视图模型中看起来像这样:

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

(它处理'创建新的'按钮和编辑按钮,因此' if')

重定向后,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。

但是,如何从网址获取ID(在这种情况下,' 1')? 而且,这是实现我想要做的事情的正确方法吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

var id = GetID();

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

答案 2 :(得分:0)

我提出了这个有效的解决方案,但我不确定这是否是最佳方式。看起来还不错。

我在我的应用程序代码中创建了一个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加载后获取数据)。但它看起来既整洁又易于管理。