2013-11-14 4 views
0

В настоящее время я пытаюсь создать веб-сайт на основе XML, который имеет доступ к URL-адресу фида. XML-канал запрашивается путем добавления параметров url к текущему URL-адресу, поэтому я использую форму с методом GET для добавления параметров в URL-адрес.ASP.Net MVC - Передача данных между представлениями

Я в настоящее время имеют форму поиска собственности, которая будет искать свойств в корм путем добавления параметров XML в URL, как так:

/Продажа/minprice = 300000 & maxprice = +500000

Это работает отлично, и пользователю отображаются правильные результаты. Однако, если бы я использовал форму фильтра, которая, например, отфильтровала эти свойства по максимальной цене, параметры подачи будут удалены при отправке формы фильтра. Новый URL после фильтра будет, например:

/Продажа/priceSort = убыванию

Как вы можете видеть, minprice и maxprice поля были полностью удалены, оставив меня с нежелательными свойствами?.

В настоящее время для борьбы с этим я использую сеансы для хранения URL-адресов для каждой страницы, а затем их объединения для создания 1-го URL-адреса. Я понимаю, что использование сессий в приложениях на базе MVC не рекомендуется.

Итак, мне действительно интересно, есть ли лучший способ хранить URL, а не использовать сеансы?

Любая помощь будет высоко оценена.

Заранее спасибо.

НЕКОТОРЫХ фрагментам кода сайта:

модели и 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 

ответ

1

В MVC вам нужно пройти все необходимые параметры (или полагаться в каком-то магазине как сессии, Cache Дб).

Итак, при сортировке вы просто отправляете столбец и заказываете ... в этом случае вам нужно также указать значения фильтра.

Правильный способ сделать это, имея ViewModel со всеми фильтрами и параметрами сортировки ... и когда вы возвращаетесь из фильтрации или сортировки, вы можете отображать текущие фильтры.

Таким образом, помимо заполнения входных фильтров текущими фильтрами, вы должны обработать ссылки, чтобы учесть все параметры. Например: при заказе вы передаете также текущие фильтры ... или если вы меняете фильтры, вы должны поддерживать sortorder, передавая его в сообщении.

Некоторый код:

Ваш 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); 
} 
+0

Действительно, MVC не хранит никаких параметров, все должно быть отправлено каждый раз или храниться внутри. Большое отличие от Web-форм ASP.NET. – RealityDysfunction

+0

Спасибо за ваши комментарии, очень ценится. Так что, возможно, лучший вариант - иметь еще один ViewModel, который имеет все параметры фильтрации и поиска в качестве свойств. Я мог бы затем присвоить значения этим свойствам через класс querystring? Я прав, или я смущаюсь. В настоящий момент я довольно дилетантский, поэтому любая помощь будет отличной. Спасибо –

+0

Нет, ваш контроллер должен иметь параметр ViewModel в качестве параметра. Структура будет обрабатывать преобразование/сопоставление значений строки запроса в свойствах ViewModel. Используете ли вы MVC так, как он был разработан, вы получаете преимущества :) – Romias

0

Рассмотрите возможность использования модели предметной области (все бизнес-данные и т.д.) и отдельные модели просмотра и расширение которые преобразуют вашу модель домена в определенную модель представления и наоборот. Развязка вашей бизнес-модели с вашей моделью взгляда с использованием направленности трансформирования дает вам возможность использовать простые и простые в использовании модели взглядов, которые соответствуют вашему представлению.

+0

Привет, спасибо за ваш ответ. Я изо всех сил пытаюсь понять необходимость в доменной модели, когда я не взаимодействую с базой данных как таковой. Я просто получаю доступ к XML-фиду. В настоящее время я использую ViewModel вместе с контроллером для доступа к узлам XML-фида. Вы говорите, что есть лучший способ сделать это? –

+0

Если ваш XML-канал совпадает с обоими вашими моделями просмотра, возможно, нет, но если есть различия и если вы хотите иметь возможность представлять данные по-разному в одном представлении от другого, то с использованием модели домена, содержащей данные XML десериализованные на красивые объекты и две разные модели представлений, позволят вам иметь больший контроль и возможность расширять и вносить изменения в одно представление, которое не влияет на другое. –

Смежные вопросы