根据先前选择的值设置下拉菜单的值

时间:2018-07-02 14:45:22

标签: c# asp.net-mvc

当前,我有一个API登录页面,用户可以在其中从下拉菜单中选择位置。登录后,会有一个登录页面。然后,用户可以转到“测试客户端”页面,在该页面中必须使用相同的“位置”下拉列表再次进行身份验证。目前,我通过将其设置为

填充位置的ViewBag列表
new SelectList(locations, "LocationID", "Name", model.LocationID)

位置是我的位置列表。 在“测试客户端”页面上,我从存储在ViewBag.Locations中的此先前构建的列表中填充列表。如何将用户选择的值从原始登录页面上的此列表继承到“测试客户端”页面?我在解决此问题时遇到了麻烦。

我尝试使用

Request.Form["LocationID"]

但是无法从“测试客户端”页面上的第一个登录页面访问第一个表单的POST请求。

5 个答案:

答案 0 :(得分:0)

您可以将其与登录页面一起发送(例如在URL中),然后将其传递到“测试客户端”页面。

答案 1 :(得分:0)

用户必须使用相同的信息登录两次似乎很奇怪,但是要回答您,您可以使用TempData在控制器之间传递数据(假设您使用的是重定向)。
TempData仅适用于用户会话,因此它一直持续到您读取它并在HTTP请求结束时被清除。
示例:

// In your login action, when it's done
TempData["Location"] = X;
return RedirectToAction(...);

// Then in your other action or it's view, just use
TempData["Location"] // and use it

如果您不使用重定向,则可能需要将值存储在会话,数据库或其他内容中。

答案 2 :(得分:0)

一种选择是使用会话状态:

Session["LocationID"]=model.LocationID;

,然后您可以从其他页面访问。如另一个答案所述,TempData做类似的事情,但范围不同。最后,您可以在网址中传递值。

答案 3 :(得分:0)

查看包用于单个页面生成。它不会在不同页面之间保留数据。

这意味着您的问题可以归结为:

  

如何在不同页面之间保留数据?

这里有一些解决方案:

  1. 使用 cookie

Cookies特别存在,因此用户的浏览器保留了以后可通过您的网页检索的信息。这仅在两个页面都在同一域中时才有效,因为对cookie的访问仅限于当前页面的域(例如,twitter cookie无法访问facebook cookie)。

  1. 使用会话数据。

会话数据专门存在以为用户提供临时数据存储。可以将会话数据视为Web服务器上的Cookie(一种),其持续时间与会话一样长(通常在20分钟左右的不活动状态或用户关闭浏览器后结束)。

(TempData与会话数据类似)

  1. 明确地将参数传递到第二页。

代替缓存值,只需使其成为第二页URL的参数即可。例如:http://www.example.com/SecondPage?selectedLocationId=123

根据生成页面的方式,Web服务器或加载的网页上的脚本都可以读取URL参数并相应地设置下拉列表的值。


还有更多解决方案,但是这些是标准解决方案,不需要太多额外的工作。

答案 4 :(得分:0)

如上述jle和Haytam的答案所建议,您可以使用Session或TempData。我不建议您使用URL查询字符串参数,因为在用户到达TestClient页面之前,您必须注意在访问的每个后续页面中携带这些参数。

但是您还提到了API登录页面。如果使用的是Web API,则将很难访问会话级内存。

我建议第三种方法,即在IdentityUser模型中创建LastUsedLocationId字段。这样,您可以轻松地查询当前用户的数据库,并获取LastUsedLocationId,并在ViewBag中使用它,例如:

new SelectList(locations, "LocationID", "Name", user.LastUsedLocationId)

user是您的数据库查询的当前用户。现在,您还可以在TestClient页面上禁用下拉菜单,并选择默认位置作为上次使用的位置。