我正在使用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为:
然后我加载了淘汰模型,并希望进行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')? 而且,这是实现我想要做的事情的正确方法吗?
答案 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加载后获取数据)。但它看起来既整洁又易于管理。