当前,我有一个API登录页面,用户可以在其中从下拉菜单中选择位置。登录后,会有一个登录页面。然后,用户可以转到“测试客户端”页面,在该页面中必须使用相同的“位置”下拉列表再次进行身份验证。目前,我通过将其设置为
填充位置的ViewBag列表new SelectList(locations, "LocationID", "Name", model.LocationID)
位置是我的位置列表。 在“测试客户端”页面上,我从存储在ViewBag.Locations中的此先前构建的列表中填充列表。如何将用户选择的值从原始登录页面上的此列表继承到“测试客户端”页面?我在解决此问题时遇到了麻烦。
我尝试使用
Request.Form["LocationID"]
但是无法从“测试客户端”页面上的第一个登录页面访问第一个表单的POST请求。
答案 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)
查看包用于单个页面生成。它不会在不同页面之间保留数据。
这意味着您的问题可以归结为:
如何在不同页面之间保留数据?
这里有一些解决方案:
Cookies特别存在,因此用户的浏览器保留了以后可通过您的网页检索的信息。这仅在两个页面都在同一域中时才有效,因为对cookie的访问仅限于当前页面的域(例如,twitter cookie无法访问facebook cookie)。
会话数据专门存在以为用户提供临时数据存储。可以将会话数据视为Web服务器上的Cookie(一种),其持续时间与会话一样长(通常在20分钟左右的不活动状态或用户关闭浏览器后结束)。
(TempData与会话数据类似)
代替缓存值,只需使其成为第二页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页面上禁用下拉菜单,并选择默认位置作为上次使用的位置。