如何从c#代码中的本地存储中检索值?

时间:2015-11-11 11:00:35

标签: javascript c# asp.net-mvc asp.net-mvc-5 local-storage

我从一个视图传递本地存储中的值,我想在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接收这个值作为参数。

2 个答案:

答案 0 :(得分:5)

本地商店位于客户端。它不会被发送到服务器,也无法从服务器代码访问。

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

答案 1 :(得分:2)

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

在此之前,让我回想一下你在这里做的事情。

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

如果您在DOM属性中分配localStorage元素引用(可能是您打算存储值但我没有详细说明),那么我没有看到将其取回的重点几乎同时从localStorage再次,因为你已经分配了它,它仍然存在于你的元素中。无论如何,这是你可以在另一个视图中获取此值的方法。

您的观点2 controller应如下所示。

public ActionResult View2(string value)
{
    // ......
    ViewBag.StorageItem = value;
    return View();
}

每当您调用此视图时,请在参数内传递value。在视图2中,您可以在ViewBag.StorageItem

的任何部分中检索此值

如何在value操作方法中设置View2

您可以从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到其他或从视图控制器。为此,您可以定义一个视图模型属性,您可以使用该属性将数据发布回视图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"];
    // ....
    // ....
}

除了参数少Post动作不存在之外,如果您没有使用模型,这只是一个想法。

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