我目前正在尝试创建一个基于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
答案 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)
考虑使用域模型(所有业务数据等)以及单独的视图模型和扩展方法,这些方法将您的域模型转换为特定的视图模型,反之亦然。使用变换间接将业务模型与视图模型分离,使您有机会使用适合您视图的简单易用的视图模型。