ASP.Net MVC - 在视图之间传递数据

时间:2013-11-14 19:41:56

标签: c# asp.net-mvc asp.net-mvc-4

我目前正在尝试创建一个基于XML的网站,该网站可以访问供稿网址。通过将url参数添加到当前URL来查询XML提要,因此我使用具有GET方法的表单来向URL添加参数。

我目前有一个属性搜索表单,它会通过向网址添加xml参数来搜索Feed中的属性,如下所示:

/销售/ minprice = 300000&安培; maxprice = 500000

这完美无缺,并向用户显示正确的结果。但是,如果我要使用以最高价格过滤这些属性的过滤器表单,则在提交过滤器表单时将删除Feed参数。过滤器之后的新URL将是:

/销售/?priceSort =降

正如您所看到的,minprice和maxprice字段已被完全删除,从而留下了不需要的属性。

目前,为了解决这个问题,我使用会话来存储每个页面的URL,然后将它们组合起来制作1个网址。我知道不建议在基于MVC的应用程序中使用会话。

所以,我真的只是想知道是否有更好的方法来存储网址而不是使用会话?

非常感谢任何帮助。

提前致谢。

网站的一些代码链接:

模型和ViewModel

    public class ResultsViewModel 
{
    public PropertyResult[] Property { get; set; } 
}

public class PropertyResult
{
    public int Count { get; set; }
    public int Pid { get; set; }
    public int RentalPeriod { get; set; }
    public string Price { get; set; }

    public string Address { get; set; }
    public string NameNumber { get; set; }
    public string SA1 { get; set; }
    public string SA2 { get; set; }
    public string Town { get; set; }
    public string City { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public string LocationCode { get; set; }

    public string PriceText { get; set; }
    public string Primary1 { get; set; }
    public string Secondary1 { get; set; }
    public string Secondary2 { get; set; }
    public string Description { get; set; }

    public string Period { get; set; }

    public int Bedrooms { get; set; }
    public int Receptions { get; set; }
    public int Bathrooms { get; set; }
    public int Garages { get; set; }
    public int Gardens { get; set; }

    public bool Featured { get; set; }
    public int Views { get; set; }
}

控制器

try
        {
            var xml = XElement.Load(resultsFeed);

            var query = (from props in xml.Descendants("property")
                         select new PropertyResult
                         {
                             // property id
                             Pid = Convert.ToInt32(props.Attribute("id").Value),

                             // Rooms Count
                             Bedrooms = Convert.ToInt32(props.Attribute("bedrooms").Value),
                             Receptions = Convert.ToInt32(props.Attribute("receptions").Value),
                             Bathrooms = Convert.ToInt32(props.Attribute("bathrooms").Value),
                             Gardens = Convert.ToInt32(props.Attribute("gardens").Value),
                             Garages = Convert.ToInt32(props.Attribute("garages").Value),

                             // 1 = sales prop, 4 = lettings prop
                             RentalPeriod = Convert.ToInt32(props.Attribute("rentalperiod").Value),

                             Period = props.Attribute("period").Value,

                             // address 
                             Address = props.Element("useAddress").Value,
                             NameNumber = props.Element("num").Value,
                             SA1 = props.Element("sa1").Value,
                             SA2 = props.Element("sa2").Value,
                             Town = props.Element("town").Value,
                             City = props.Element("city").Value,
                             County = props.Element("county").Value,
                             Postcode = props.Element("postcode").Value,

                             // location code
                             LocationCode = props.Element("locationcodes").Value,
                             Featured = Convert.ToBoolean(props.Attribute("featured").Value),

                             // description
                             Description = props.Element("summaryDescription").Value,

                             // price
                             Price = props.Attribute("price").Value,
                             PriceText = props.Element("pricetext").Value,



                             // images
                             Primary1 = "http://lb.dezrez.com/Imaging/PictureResizer.ASP?Position=1&AgentId=" + eaid + "&BranchId="+ bid + "&width=1000&Category=Primary&PropertyId=",
                             Secondary1 = "http://www.dezrez.com/estate-agent-software/ImageResizeHandler.do?&photoID=2&AgentID=1239&BranchID=1976&Width=1000&PropertyId=",
                             Secondary2 = "http://www.dezrez.com/estate-agent-software/ImageResizeHandler.do?&photoID=3&AgentID=1239&BranchID=1976&Width=1000&PropertyId=",
                         }).ToArray();

查看

我正在访问每个节点,如下所示:

@Model.Property[i].Gardens

2 个答案:

答案 0 :(得分:1)

在MVC中,您需要传递所有需要的参数(或者将某些存储作为Session,Cache,Db)。

因此,在排序时,您只是发送列和订单...在这种情况下,您还需要发布过滤器值。

执行此操作的正确方法是使用包含所有过滤器和排序参数的ViewModel ...当您从过滤或排序返回时,您可以呈现当前过滤器。

因此,除了使用当前过滤器填充过滤器输入外,您还应制作链接以考虑所有参数。例如:在订购时,您也传递当前过滤器...或者如果您更改过滤器,您应该维护排序顺序,将其传递给帖子。

部分代码:

您的ViewModel:

public class SalesFilter{
   public int? MinPrice {get; set;}
   public int? MaxPrice {get; set;}
   public int? IdTypeOfSale {get; set;}
   ...
   ...
   ...
   public IEnumerable<Sale> FilteredValues {get; set;}

   //SelectLists if you need that your filters being DropDownLists
   public SelectList TypesOfSales {get; set;}
}

您的控制器:

public ActionResult Sales(){
   var model = new SalesFilter();
   model.FilteredValues = db.YourSales.Where(/*your init conditions*/);
   //set other initial values in your ViewModel

   return View(model);
}

[HttpPost]
public ActionResult Sales(SalesFilter filters){
   model.FilteredValues = db.YourSales.Where(/*use the conditions of your filter */);

model.TypesOfSales = new SelectList(db.TypesOfSales, "idType", "Name", filter.IdTypeOfSale);

   return View(model);
}

答案 1 :(得分:0)

考虑使用域模型(所有业务数据等)以及单独的视图模型和扩展方法,这些方法将您的域模型转换为特定的视图模型,反之亦然。使用变换间接将业务模型与视图模型分离,使您有机会使用适合您视图的简单易用的视图模型。