【问题标题】: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”? 而且,这是实现我想要做的事情的正确方法吗?

【问题讨论】:

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


    【解决方案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 加载后获取数据)。但它看起来整洁且易于管理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 2020-05-16
        • 2017-07-20
        • 2020-03-01
        • 1970-01-01
        • 2020-06-12
        相关资源
        最近更新 更多