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

5

我正在从一个视图中传递一个local storage的值,并且我想在另一个视图中调用这个值来使用C#函数。这两个操作结果都在同一个控制器中。我不知道如何在C#中调用这个local storage的值,可以有人帮我吗?

   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 控制器在这里看一下 - Rohit416
@Rohit416 不,我不想从JS传递值到控制器。实际上,我想从view1的JS传递值到view2的C#,也就是想要在一个视图中将值传递到另一个视图中。 - dania
2个回答

6

本地存储是在客户端上的。它不会被发送到服务器,并且无法从服务器代码中访问。

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


4
如何明确地发送它?您能否详细说明您的答案?我不理解您的回答。 - dania

4

具体的实现取决于您,我只是分享了这个想法。

您的View2控制器应该如下所示:

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

每次调用此控制器时,请提供值。在View2中,您可以通过使用ViewBag.StorageItem在任何部分检索此值。

注意:ViewBag是ASP.NET MVC中的动态属性,不需要类型转换和动态转换类型。

在View2操作方法中设置value

您可以从JavaScript或控制器中设置它。

使用JavaScript

var audioElement = document.getElementById(audioId);
if (typeof (Storage) !== "undefined") {
    localStorage.setItem("audiourl", audioElement);
    document.getElementById("result").innerHTML = localStorage.getItem["audiourl"];
}
// redirecting to View2..
window.location.href = "/controller/view2?value=" + localStorage.getItem["audiourl"];

使用控制器

如果您想要从一个操作方法传递值到另一个操作方法,或者从视图传递值到控制器,则不能在此情况下使用ViewBag。您需要一个视图模型属性来实现此目的,您可以使用该属性将数据发送回View1的控制器,然后将此值传递给View2的控制器。

例如:如果您的视图模型中有一个名为StorageItem的属性,则可以在视图中绑定它到一个隐藏字段中。

HTML

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

控制器

[HttpPost]
public ActionResult View1(MyModel model)
{
    // Do something with the value
    var storageItem = model.StorageItem;
    // ....
}

无法使用视图模型?

虽然最理想的情况是可以使用视图模型,但如果无法使用,您仍然可以按照以下步骤在控制器中访问值:Request.Form["StorageItem"]

HTML

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

JavaScript

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;
}

控制器

[HttpPost]
public ActionResult View1(Something something)
{
    // ....
    var storageItem = Request.Form["StorageItem"];
    // ....
    // ....
}

提示: 如果你只是为了在 ASP.NET MVC 中传递值而使用 localStorage,那么它是不重要的。有更好的选择可供使用。


你的解决方案是有效的,但是 window.location.href = "/controller_name/view2?value=" + localStorage.getItem["audiourl"]; 会将我重定向到另一个页面,而 view2 实际上是一个对话框弹出窗口,我正在从我的 view1 中调用它。 - dania
哦,现在你提供了之前应该提供的细节。那么,在这种情况下,你不能使用 window.location.href,而是需要向 View2 动作发出带有 data 的 ajax 调用。 - Rohit416
抱歉,现在能告诉我如何同时传递数据并向View2动作发起Ajax调用吗? - dania
在这种情况下,您需要更新您的问题并提供更多详细信息,例如您如何在弹出窗口中调用视图等。 - Rohit416
我正在像这样调用我的视图作为对话框。<dialog id="myDialog2" style="position: absolute; top: 0px; left: 0px; "> @Html.Partial("View2") </dialog> view2是部分视图,实际上想要从视图1的javascript发送值(到其c#部分。并且c#代码是在视图中而不是在操作结果中编写的)......如果可以在不使用本地存储的情况下完成,则不需要使用本地存储。 - dania

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接