0

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

我目前有一个属性搜索表单,它将通过向 url 添加 xml 参数来搜索提要中的属性,如下所示:

/销售/?minprice=300000&maxprice=500000

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

/Sales/?priceSort=descending

如您所见, minprice 和 maxprice 字段已被完全删除,给我留下了不需要的属性。

目前,为了解决这个问题,我正在使用会话来存储每个页面的 URL,然后将它们组合成 1 个 URL。我知道不完全推荐在基于 MVC 的应用程序中使用会话。

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

任何帮助将非常感激。

提前致谢。

该网站的一些代码片段:

模型和视图模型

    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
4

2 回答 2

1

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

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

正确的方法是拥有一个包含所有过滤器和排序参数的 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);
}
于 2013-11-14T19:46:54.430 回答
0

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

于 2013-11-14T19:53:51.000 回答