如何在 C# 代码中从本地存储中检索值?

Posted

技术标签:

【中文标题】如何在 C# 代码中从本地存储中检索值?【英文标题】:How to retrieve a value from the local storage in c# code? 【发布时间】:2016-02-12 11:03:52 【问题描述】:

我正在从一个视图传递本地存储中的一个值,我想在 c# 函数的另一个视图中调用这个值。两个动作结果都在同一个控制器中。我不知道如何在 c# 中调用这个本地存储值,有人可以帮助我吗?

   view1.cshtml:
   <script>
   ...
    var audioElement = document.getElementById(audioId);
            // Check browser supporta
            if (typeof (Storage) !== "undefined") 
                //Store
                localStorage.setItem("audiourl", audioElement);

                //Retrieve
                document.getElementById("result").innerHTML = localStorage.getItem["audiourl"];
             
   </script>
 <div id="result"></div>

通过这个值已经被传递,现在如何在c#函数的另一个视图中从localstorage接收这个值作为参数。

【问题讨论】:

我看到你已经标记了Asp.Net MVC 5,如果你知道发生了什么,这并不难实现。基本上你想要的是将一个值从JS 传递到MVC controller。 Take a look here. @Rohit416 不,我不想将值从 js 传递给控制器​​。实际上我想将 view1 的 js 中的值传递给 view2 的 c# 意味着要将值从一个视图传递到另一个视图。 【参考方案1】:

本地存储在客户端。它不会发送到服务器,也无法从服务器代码访问。

如果您在服务器代码中需要它,您必须自己明确发送。

【讨论】:

如何显式发送。你能详细说明你的答案吗?我没有得到你的答案。【参考方案2】:

可能会有点长,所以我将其作为答案而不是评论。这更多是一种逻辑,实际实现取决于您,但主要目标是分享想法。

在此之前,让我回忆一下你在这里做什么。

<script>
    var audioElement = document.getElementById(audioId);
    if (typeof (Storage) !== "undefined") 
        localStorage.setItem("audiourl", audioElement);
        document.getElementById("result").innerHTML = localStorage.getItem["audiourl"];
    
</script>

如果您在 localStorage 属性中分配 DOM 元素引用(也许您打算存储该值,但我不会详细说明),那么我看不出从 localStorage 取回它的意义几乎同时再次,因为您已经分配了它并且它仍然存在于您的元素中。无论如何,这就是您可以在另一个视图中获取此值的方式。

您的视图 2 controller 应如下所示。

public ActionResult View2(string value)

    // ......
    ViewBag.StorageItem = value;
    return View();

每当您调用此视图时,请在参数内传递value。在视图 2 中,您可以在 ViewBag.StorageItem 的任何部分中检索此值。

你是如何在View2操作方法中设置value的?

您可以通过scriptcontroller 执行此操作。如果您是通过脚本进行的,请像这样设置value...

<script>
    var audioElement = document.getElementById(audioId);
    if (typeof (Storage) !== "undefined") 
        localStorage.setItem("audiourl", audioElement);
        document.getElementById("result").innerHTML = localStorage.getItem["audiourl"];
    
    // redirecting to view 2..
    window.location.href = "/controller_name/view2?value=" + localStorage.getItem["audiourl"];
</script>

这很简单,但是如果您想从 controller 级别执行此操作,那么您不能只使用 ViewBag 从一个 action 方法 到另一个或从 viewcontroller。为此,您可以定义一个视图模型属性,您可以使用该属性将数据发布回视图 1 的 controller ,然后可以将此值传递给视图 2 的 controller 即说你在您的视图模型中有一个名为 StorageItem 的属性。

@Html.HiddenFor(x => x.StorageItem)

控制器

[HttpPost]
public ActionResult View1(MyModel model)

    // ....
    var storageItem = model.StorageItem;
    // ....
    // ....

如果您没有将视图与任何模型绑定,您仍然可以在控制器中访问该值,使用 Request.Form["StorageItem"]

<input type = "hidden" name="StorageItem" value="" />

<script>
    var audioElement = document.getElementById(audioId);
    if (typeof (Storage) !== "undefined") 
        localStorage.setItem("audiourl", audioElement);
        var item = localStorage.getItem["audiourl"];

        document.getElementById("result").innerHTML = item;
        document.getElementById("StorageItem").value = item;
    
</script>

控制器

[HttpPost]
public ActionResult View1()

    // ....
    var storageItem = Request.Form["StorageItem"];
    // ....
    // ....

除了不存在参数less Post 动作之外,这只是一个想法,如果你不使用模型,你会怎么做。

总结:我不知道您使用localStorage 的目的,但如果您只是将值从一个视图传递到另一个视图,那么您可以省略它,因为您可能已经注意到它并不重要,但最终它是您的偏好。

【讨论】:

您的解决方案正在运行,但 window.location.href = "/controller_name/view2?value=" + localStorage.getItem["audiourl"];正在将我重定向到另一个页面,view2 实际上是我在 view1 上调用的对话框弹出窗口 哦,现在你给出了你应该早先给出的细节。那么在这种情况下,您不能使用window.location.href,而是需要对View2 操作以及data 进行ajax 调用。 很抱歉,现在您能告诉我如何对 View2 操作进行 ajax 调用以及数据。 在这种情况下,您需要更新您的问题并提供更多详细信息,例如您如何调用弹出窗口中的视图等... 我将我的视图称为这样的对话框。 @Html.Partial("View2") view2 是实际想要发送值的局部视图(到它的 c# 部分。并且 c# 代码是在视图中而不是在操作结果中编写的)从视图 1 的 javascript ......如果可以在不使用本地存储的情况下完成,则不需要使用本地存储,那么它会好的。

以上是关于如何在 C# 代码中从本地存储中检索值?的主要内容,如果未能解决你的问题,请参考以下文章

将输入值保存到本地存储并在不同的页面上检索它

从本地存储中保存和检索日期

如何将 JSON 数据存储和检索到本地存储中?

如何使用 Angularjs 将数据存储在本地存储中?

如何添加和删除本地存储中的数据?

如何添加和删除本地存储中的数据?