首页 > 解决方案 > 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>();
}

标签: c#asp.net-mvcweb-applications

解决方案


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

请参阅此链接以了解如何使用


推荐阅读