2012-05-28 2 views
1

Имея проблему в приложении MVC3 Razor (ASP.NET) при попытке доступа к представлению Модель выглядит так (аннотации удалены)Получение «Объекта не содержит определения для xxx» с использованием LabelFor в строго типизированном представлении

namespace MvcTest.Models { 
     public class ContactMeModel { 
     public string From { get; set; } 
     public string Subject { get; set; } 
     public string Message { get; set; } 
    } 
} 

The View есть что-то вроде этого (частичный, просто кладя ту часть, которая дает ошибку, не пройти, что ...

@model MvcTest.Models.ContactMeModel 
@{ 
    ViewBag.Title = "test" 
} 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.From) 
    </div> 
} 

Пространства имен являются правильными, но IntelliSense показывает красный цвет на части. От части разметки, как если бы она не узнайте модель, но это происходит и с представлениями, которые тоже работают.

Когда я достигаю View я получаю следующее сообщение об ошибке:

CS1061: 'object' does not contain a definition for 'From' and no extension method 'From' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) 

Это странно, потому что (а) Веб-проект Mvc ИМЕЕТ ссылку на DLL, которая содержит модели (б) Весь проект имеет (c) Ссылка на модель в представлении имеет правильное полное имя модели (d) существует класс модели (e) нет ошибок компиляции, кроме времени выполнения на этом представлении.

К слову, возникнет ошибка в любом у меня есть @ Html.LabelFor, так, например, фондовый LogOn.cshtml имеет линию, которая производит ту же ошибку:

@Html.LabelFor(m => m.UserName) 

И в «IntelliSense «Я вижу текст« UserName », подчеркнутый красной линией зигзагообразно, и intellisense упоминает ту же ошибку. Но если на той же странице я навешиваю строку @model на имя модели и делаю «Перейти к определению», VS выводит меня на определение. Значит, он знает, что такое модель, но потом не совсем ?! Если пространство имен модели неверно, я получаю ошибку «навигации», когда я выбираю «Перейти к определению».

метод действия

Контроллер выглядит следующим образом:

public ActionResult Contact() 
    { 
     return View(new Coralys.PanamaVibes.Mvc.Models.ContactMeModel()); 
    } 

да так, она возвращает правильную модель, а не анонимный тип.

+1

Вы уверены, что код успешно завершен? создайте свой код из представления, что он получает проблемы – Jorge

+0

Вы пытались настроить VS для компиляции просмотров? Инструкции здесь: http://www.dotnetcurry.com/ShowArticle.aspx?ID=698 – hatchet

+0

@Jorge Да, он успешно работает, без ошибок только во время выполнения. –

ответ

5

Провел весь день, прочесывая интернет и исследуя. Я сравнил свое старое решение и новое и нашел преступника.

Как оказалось, помимо отличия в содержании и некотором другом коде, основное отличие заключалось в том, что в сломанном решении я реализовал пользовательскую веб-страницу. Это пришло ко мне в момент просветления. Так что это привело меня к следующему вопросу: почему он ломает только строго типизированные представления, и все же он может перейти к моделям?

Простой ответ: пользовательская веб-страница состоит из обычной версии и общей версии. Общая версия используется для сильно типизированных представлений.

Я изучил пользовательскую веб-страницу, которую я улучшил из вклада @ haacked в его блоге. Один из последних комментариев в этом блоге был от человека (Мэтью), который использовал его с строго типизированными взглядами и испытывал ту же проблему. Таким образом, решение заключалось в том, чтобы изменить общую версию пользовательской веб-страницы, чтобы вместо наследования от нестандартной версии, она наследуется от WebViewPage. Затем все строго типизированные представления снова работали, и ошибка CS1061 исчезла.

Я также настоятельно рекомендую совет @hatchet, чтобы включить BuildViews в версии Release (не в Debug, поскольку он удлиняет фазу восстановления).

Пример пользовательского WebViewPage, хотя и сломанный как опубликованный, является очень полезным, теперь я могу создать свои собственные помощники, не переполняя помощники Html и Url. Как ни странно, когда я искал что-то подобное, это была единственная реальная статья, которая касалась вопроса о создании ваших пользовательских помощников в MVC3.

+3

Приятный намек для меня. Короче говоря, я исправляю, объявляя класс как этот открытый публичный класс CustomWebViewPage : System.Web.Mvc.WebViewPage '. Обратите внимание на последний' 'исправить ошибку. – CallMeLaNN

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