ASP.NET MVC: контроллер соединения с моделью - PullRequest
0 голосов
/ 24 ноября 2010

Я все еще учусь, но с помощью коммьюниторов stackoverflow я смог все ближе и ближе.

Сейчас у меня есть представление «Index.aspx»:

System.Web.Mvc.ViewPage<Data.Models.GetDealsModel>

Модель:

public class GetDealsModel
    {
        // set up the model
        public string DealId { get; set; }
        public string StreetAddress { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
        public string Logo { get; set; }
        public string Website { get; set; }

        public string TotalRows { get; set; }

    }

И контроллер:

public ActionResult Index()
        {
            LinqToDealsDataContext db = new LinqToDealsDataContext();
            XElement xmlTree = XElement.Parse("<Request><ZipCode>92612</ZipCode></Request>");

            var deals = db.spSearchDeals(xmlTree);

            return View(deals);
        }

И с этой конфигурацией я теперь получаю эту ошибку:

The model item passed into the dictionary is of type 'System.Data.Linq.SqlClient.SqlProvider+SingleResult`1[Data.Models.spSearchDealsResult]', but this dictionary requires a model item of type 'Data.Models.GetDealsModel'.

Я предполагаю, что есть проблема с подключением моего контроллера к моей модели ... Я не знаю почему. ПОЖАЛУЙСТА, помогите мне подключить этот последний кусок.

ПРИМЕЧАНИЕ. Я понимаю, что в конечном итоге я должен разделить свою логику в контроллере на шаблон репозитория, но сейчас это будет сделано.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Вам необходимо перевести данные, поступающие с этого звонка:

var deals = db.spSearchDeals(xmlTree);

в GetDealsModel тип. Так что-то вроде:

GetDealsModel dealsModel = new GetDealsModel()
{
   DealId = deals.DealId,
   StreetAddress = deals.StreetAddress,
....
};

return View(dealsModel);

Причина в том, что ваш View строго типизирован и принимает GetDealsModel, но ваша переменная deals не относится к этому типу, и это дает вам это исключение при передаче его в View.

1 голос
/ 24 ноября 2010

Вы должны создать объект типа GetDealsModel, но ваш запрос к БД возвращает объект типа Data.Models.spSearchDealsResult. Попробуйте что-то вроде:


return new GetDealsModel
           {
              DealId = deals.Id,
              // other fields here
           }

0 голосов
/ 24 ноября 2010

Добавьте к своему списку кривой обучения следующие элементы:

  1. Шаблон репозитория

  2. Задайте себе следующий вопрос: зачем мнеуровень обслуживания?

  3. Прочитайте книгу Стивена Сандерсона.Он учит вас думать в MVC.

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

Ваша модель должна включать в себя необходимые классы репозитория, например, DealRepository.

Вам нужен класс Service для сопоставленияобъекты, которые ваш репозиторий выкапывает из вашей базы данных в ваш класс модели: таким образом, проблемы преобразования включаются в код уровня обслуживания.

Если вы сделаете это, вы можете написать в свой контроллер:

public ActionResult Index()
        {
            return(DealService.GetByZipcode(92612));
        }

Где DealService.GetByZipcode в основном просто сопоставляет DealRepository.GetByZipcode (92612) с вашим классом модели и возвращает результат сопоставления.

Метод DealRepository.GetByZipcode будет примерно равен:

public static DealEntity GetByZipcode(string zip)
{
            LinqToDealsDataContext db = new LinqToDealsDataContext();
            XElement xmlTree = XElement.Parse("<Request><ZipCode>" + zip + "</ZipCode></Request>");

            var deals = db.spSearchDeals(xmlTree);

            return deals;
        }

Класс DealEntity - это то, что дает вам Linq для вашей таблицы.

Причина, по которой все это происходит:

Причина этой структуры следующая:

а.Весь ваш код доступа к данным находится в одном месте: DealRepository.Вы можете проверить и отладить это независимо от всего остального.

b.Код сопоставления находится в одном месте: DealService.Вы можете проверить и отладить это независимо от всего остального.

c.Другими словами, вам нужно правильно разделить свои проблемы.

Проблема с вашим существующим кодом состоит именно в том, что вы НЕ разделяли проблемы.То есть, вы взяли прибор MVC и поместили его в кухонный комбайн, и у вас возникло множество проблем, с которыми гораздо сложнее справиться, чем нужно.

Ваша модель смешана с вашим контроллером, нет репозитория, нет сервисного уровня.

Так что держите лошадей ненадолго и найдите время, чтобы прочитать книгу Стива Сандерсона.

Я бы также попробовал смоделировать более простую задачу.Этот синтаксический анализ XML заставляет мою голову болеть даже в хороший день.

ПРИМЕЧАНИЕ:

Вы можете серьезно улучшить свои соглашения об именах.LinqToDealsDataContext?Ты шутишь, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...