c# - MVC 复用模型
问题描述
我有一个 MVC Web 应用程序,它使用表单从用户那里获取邮政编码,然后查询外部 Web 服务并向视图返回地址列表。
我有一个以前的问题,我的模型是静态的,因此数据被显示给其他客户端上的用户,而不是特定于每个用户。我现在已经得到它,因此每个单独的用户都可以在视图上查询并获取他们的地址列表(其他人看不到)但是,当用户刷新页面或返回时,数据会丢失。
我在页面刷新上有一些代码检查数据是否存在并且不会将用户带到表单的开头,但是在页面刷新时模型返回为空,因此它总是会将它们带回到开头。
有任何想法吗?理想情况下,我希望能够为当前用户多次使用数据,但如果他们刷新并通过表单说 90%,他们将丢失整个数据。看起来应该很容易,但是我尝试过的所有示例都不适用于我的特定场景。
控制器:
public class AssistedController : Controller
{
// GET: Assisted
AddressList model;
public ActionResult Index()
{
return View(model);
}
[HttpPost]
public ActionResult GetAddresses(string postcode)
{
model = new AddressList();
if (postcode == null || postcode == "")
{
return RedirectToAction("/Index/");
}
//call enviroweb web service
AddressWeb ew = new AddressWeb();
//extract address values from the XML returned from web service
XmlNode xml = ew.GetAddress(", , , , " + postcode);
foreach (XmlElement addressInfo in xml)
{
foreach (XmlElement teset in addressInfo["Addresses"])
{
//add each address item found to the list
model.listone.Add(new AddressResults {
FullAddress = teset["fulladdress"].InnerText,
Lat = teset["Lat"].InnerText,
Lon = teset["Long"].InnerText,
addLine1 = teset["addline1"].InnerText,
addLine2 = teset["addline2"].InnerText,
addLine3 = teset["addline3"].InnerText,
addLine4 = teset["addline4"].InnerText,
Town = teset["Town"].InnerText,
postcode = teset["postcode"].InnerText,
Ownership = teset["Ownership"].InnerText,
WeekNumber = teset["WeekNumber"].InnerText
});
}
}
//return the list and model back to the index view
return View("Index", model);
}
看法:
<!--Use the model to return the data-->
@model AddressSearch.Models.AddressList
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@if (Model == null)
{
}
else
{
if (Model.listone.Count != 0)
{
//this section returns the items as options in the select if the list count is greater than 0.
foreach (var test in Model.listone)
{
<option value="@test.FullAddress">@test.FullAddress</option>
}
}
}
模型:
public class AddressList
{
public List<AddressResults> listone = new List<AddressResults>();
}
解决方案
ASP.NET MVC 中的 TempData 可用于存储可用于后续请求的临时数据。TempData 将在后续请求完成后被清除。
public class AssistedController : Controller
{
// GET: Assisted
AddressList model;
public ActionResult Index()
{
if (TemData.ContainsKey("address"))
{
model = TempData["address"] as AddressList;
}
return View(model);
}
[HttpPost]
public ActionResult GetAddresses(string postcode)
{
model = new AddressList();
if (postcode == null || postcode == "")
{
return RedirectToAction("/Index/");
}
if (TemData.ContainsKey("address"))
{
model = TempData["address"] as AddressList;
return View(model);
}
//call enviroweb web service
AddressWeb ew = new AddressWeb();
//extract address values from the XML returned from web service
XmlNode xml = ew.GetAddress(", , , , " + postcode);
foreach (XmlElement addressInfo in xml)
{
foreach (XmlElement teset in addressInfo["Addresses"])
{
//add each address item found to the list
model.listone.Add(new AddressResults
{
FullAddress = teset["fulladdress"].InnerText,
Lat = teset["Lat"].InnerText,
Lon = teset["Long"].InnerText,
addLine1 = teset["addline1"].InnerText,
addLine2 = teset["addline2"].InnerText,
addLine3 = teset["addline3"].InnerText,
addLine4 = teset["addline4"].InnerText,
Town = teset["Town"].InnerText,
postcode = teset["postcode"].InnerText,
Ownership = teset["Ownership"].InnerText,
WeekNumber = teset["WeekNumber"].InnerText
});
}
}
TempData["address"] = model;
//return the list and model back to the index view
return View("Index", model);
}
}
请参阅此链接以了解如何使用
推荐阅读
- python - 如何根据 ping 做出机器人回复?(短信)
- regex - 正则表达式:如何将具有固定长度区域的整个字符串与之后被覆盖的负前瞻条件匹配?
- python - 如何强制 sphinx 在多级项目中仅使用文件名作为标题?
- amazon-web-services - 为什么我会收到“zip 的内容不是有效的 UTF-8;” 在 Terraform 中使用 filebase64sha256 时?
- python - 在 MS Teams 中使用 Python 点赞消息
- go - 如何在本地运行 pkg.go.dev 作为 godoc 替代品?
- qt - 将外部库添加到 QT 应用程序时出现链接器错误
- php - 在 codeigniter 4 中设置 cookie 不起作用
- json - Dotliquid 未在 json 正文中明确识别给定的 null 值
- php - PHPUnit - 模拟树枝模板