none
Странная ошибка CS1061 при выполнении MVC3 проекта. RRS feed

  • Вопрос

  • Здравствуйте,

    Редактирую nopcommerce (MVC3 проект) в VS 2012 RC.

    1. Добавляю:

            public bool FaxEnabled { get; set; }

    в файл AddressModel.cs

    В начале этого файла такой текст:

    using System.Collections.Generic;
    using System.Web.Mvc;
    using FluentValidation.Attributes;
    using Nop.Web.Framework;
    using Nop.Web.Framework.Mvc;
    using Nop.Web.Validators.Common;

    namespace Nop.Web.Models.Common
    {
        [Validator(typeof(AddressValidator))]
        public partial class AddressModel : BaseNopEntityModel
        {...

    2. Далее открываю _CreateOrUpdateAddress.cshtml.

    Вначале этого файла такой текст:

    @model AddressModel
    @using Nop.Web.Framework;
    @using Nop.Web.Models.Common;

    Дописываю в него:

    @if (Model.FaxEnabled){

    ...

    }

    Intellisense FaxEnabled видит. Построение проходит без ошибок.

    Но во время выполнения(отладки) проекта получаю исключение в BuildManager.GetObjectFactory(virtualPath, false):

    d:\temp\nopCommerce_2.60_Source\Presentation\Nop.Web\Views\Shared\_CreateOrUpdateAddress.cshtml(37): error CS1061: 'Nop.Web.Models.Common.AddressModel' does not contain a definition for 'FaxEnabled' and no extension method 'FaxEnabled' accepting a first argument of type 'Nop.Web.Models.Common.AddressModel' could be found (are you missing a using directive or an assembly reference?)

    Еще странность заключается в том, что в начале файла _CreateOrUpdateAddress.cshtml есть яваскрипт. Я попробовал его удалил и запустил проект заново - все сработало как положено. Добавил скрипт в конец файла. Тоже все сработало как положено. Попробовал добавить еще одну переменную и аналогичную ссылку @if на нее. Опять такая же ошибка. Удалил эту вторую переменную и удалил вообще яваскрипт. Опять ошибка на первой переменной. Получается в основном ее не видно, но иногда бывает и сработает.

    В чем проблема не пойму.

    6 августа 2012 г. 20:58

Ответы

  • Нашел решение. Оказалось почему-то студия перестала перестраивать проект. Причем очистить решение и перестроить решение не работало (ничего не перестраивалось). Удалось перестроить только через пакетное построение, когда выделил все проекты и нажал там перестроить. Поэтому переменные в модели и не находились, т.к. они в исходный код добавились, а в откомпилированный нет. Я еще все думал почему это мне при отладке пишется на точки остановки, что исходный код отличается... И ведь ничего в настройках не менял. Почему перестроение отключилось не понятно.
    • Изменено Argaricolm 8 августа 2012 г. 17:54
    • Предложено в качестве ответа YatajgaModerator 9 августа 2012 г. 13:50
    • Помечено в качестве ответа Abolmasov Dmitry 17 августа 2012 г. 8:39
    8 августа 2012 г. 14:01

Все ответы

  • А покажите ка полный код представления и AddressModel.
    7 августа 2012 г. 5:27
    Модератор
  • Представление:

    @model AddressModel
    @using Nop.Web.Framework;
    @using Nop.Web.Models.Common;
    
    @Html.HiddenFor(model => model.Id)
    <table>
        <tr>
            <td>
                @Html.LabelFor(model => model.FirstName):
            </td>
            <td>
                @Html.EditorFor(model => model.FirstName)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.FirstName)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.LastName):
            </td>
            <td>
                @Html.EditorFor(model => model.LastName)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.LastName)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.Email):
            </td>
            <td>
                @Html.EditorFor(model => model.Email)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.Email)
            </td>
        </tr>
        @if (Model.CompanyEnabled){
        <tr>
            <td>
                @Html.LabelFor(model => model.Company):
            </td>
            <td>
                @Html.EditorFor(model => model.Company)
                @Html.ValidationMessageFor(model => model.Company)
            </td>
        </tr>
        }
        <tr>
            <td>
                @Html.LabelFor(model => model.CountryId):
            </td>
            <td>
                @Html.DropDownListFor(model => model.CountryId, Model.AvailableCountries)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.CountryId)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.StateProvinceId):
            </td>
            <td>
                @Html.DropDownListFor(model => model.StateProvinceId, Model.AvailableStates)
                <span id="states-loading-progress" style="display: none;">@T("Common.Wait...")
                    <img src='@Url.Content("~/Content/Images/ajax_loader_small.gif")' alt="@T("Common.Wait...")" />
                </span>
                @Html.ValidationMessageFor(model => model.StateProvinceId)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.City):
            </td>
            <td>
                @Html.EditorFor(model => model.City)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.City)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.Address1):
            </td>
            <td>
                @Html.EditorFor(model => model.Address1)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.Address1)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.Address2):
            </td>
            <td>
                @Html.EditorFor(model => model.Address2)
                @Html.ValidationMessageFor(model => model.Address2)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.ZipPostalCode):
            </td>
            <td>
                @Html.EditorFor(model => model.ZipPostalCode)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.ZipPostalCode)
            </td>
        </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.PhoneNumber):
            </td>
            <td>
                @Html.EditorFor(model => model.PhoneNumber)
                @Html.RequiredHint()
                @Html.ValidationMessageFor(model => model.PhoneNumber)
            </td>
        </tr>
        @if (Model.FaxEnabled){
        <tr>
            <td>
                @Html.LabelFor(model => model.FaxNumber):
            </td>
            <td>
                @Html.EditorFor(model => model.FaxNumber)
                @Html.ValidationMessageFor(model => model.FaxNumber)
            </td>
        </tr>
        }
    </table>
    

    Модель:

    using System.Collections.Generic;
    using System.Web.Mvc;
    using FluentValidation.Attributes;
    using Nop.Web.Framework;
    using Nop.Web.Framework.Mvc;
    using Nop.Web.Validators.Common;
    
    namespace Nop.Web.Models.Common
    {
        [Validator(typeof(AddressValidator))]
        public partial class AddressModel : BaseNopEntityModel
        {
            public AddressModel()
            {
                AvailableCountries = new List<SelectListItem>();
                AvailableStates = new List<SelectListItem>();
                FaxEnabled = true;
                CompanyEnabled = true;
             }
    
            [NopResourceDisplayName("Address.Fields.FirstName")]
            [AllowHtml]
            public string FirstName { get; set; }
            [NopResourceDisplayName("Address.Fields.LastName")]
            [AllowHtml]
            public string LastName { get; set; }
            [NopResourceDisplayName("Address.Fields.Email")]
            [AllowHtml]
            public string Email { get; set; }
            [NopResourceDisplayName("Address.Fields.Company")]
            [AllowHtml]
            public string Company { get; set; }
            [NopResourceDisplayName("Address.Fields.Country")]
            public int? CountryId { get; set; }
            [NopResourceDisplayName("Address.Fields.Country")]
            [AllowHtml]
            public string CountryName { get; set; }
            [NopResourceDisplayName("Address.Fields.StateProvince")]
            public int? StateProvinceId { get; set; }
            [NopResourceDisplayName("Address.Fields.StateProvince")]
            [AllowHtml]
            public string StateProvinceName { get; set; }
            [NopResourceDisplayName("Address.Fields.City")]
            [AllowHtml]
            public string City { get; set; }
            [NopResourceDisplayName("Address.Fields.Address1")]
            [AllowHtml]
            public string Address1 { get; set; }
            [NopResourceDisplayName("Address.Fields.Address2")]
            [AllowHtml]
            public string Address2 { get; set; }
            [NopResourceDisplayName("Address.Fields.ZipPostalCode")]
            [AllowHtml]
            public string ZipPostalCode { get; set; }
            [NopResourceDisplayName("Address.Fields.PhoneNumber")]
            [AllowHtml]
            public string PhoneNumber { get; set; }
            [NopResourceDisplayName("Address.Fields.FaxNumber")]
            [AllowHtml]
            public string FaxNumber { get; set; }
            
            public bool FaxEnabled { get; set; }
            public bool CompanyEnabled { get; set; }
    
            public IList<SelectListItem> AvailableCountries { get; set; }
            public IList<SelectListItem> AvailableStates { get; set; }
        }
    }

    Вот сейчас попробовал удалил CompanyEnabled из обоих и сработало. Добавил назад и вышеуказанная ошибка.

    Раньше такая же ошибка была когда добавлял FaxEnabled.


    7 августа 2012 г. 23:37
  • Используйте строго типизированное представление, т.е указывайте модель явно: @model MyModelType. И ещё посмотрите в вашем web.config нет ли там ссылок на старые сборки mvc с версиями 2.0.0.0, еслиесть замените на 3.0.0.0.(только сборки mvc).

    8 августа 2012 г. 12:59
    Модератор
  • Нашел решение. Оказалось почему-то студия перестала перестраивать проект. Причем очистить решение и перестроить решение не работало (ничего не перестраивалось). Удалось перестроить только через пакетное построение, когда выделил все проекты и нажал там перестроить. Поэтому переменные в модели и не находились, т.к. они в исходный код добавились, а в откомпилированный нет. Я еще все думал почему это мне при отладке пишется на точки остановки, что исходный код отличается... И ведь ничего в настройках не менял. Почему перестроение отключилось не понятно.
    • Изменено Argaricolm 8 августа 2012 г. 17:54
    • Предложено в качестве ответа YatajgaModerator 9 августа 2012 г. 13:50
    • Помечено в качестве ответа Abolmasov Dmitry 17 августа 2012 г. 8:39
    8 августа 2012 г. 14:01
  • Спасибо, что поделились решением проблемы.


    Для связи [mail]

    17 августа 2012 г. 8:39