ASP.NET MVC не приводит объект Model на странице aspx к соответствующему, отправив Model на эту страницу - PullRequest
2 голосов
/ 09 ноября 2011

РЕДАКТИРОВАНИЕ

У меня проблема.ASP.NET MVC не приводит модель к соответствующей модели представления на странице * .aspx.Например: я передал MyViewModel (со свойством MyProperty) на страницу (верните View (MyViewModel) в Action в Controler), но затем во время выполнения я получаю ошибку, подобную этой.'не содержит определения для' MyProperty ', и метод расширения' MyProperty ', принимающий первый аргумент типа' объект ', не найден (отсутствует директива using или ссылка на сборку?)

Где объект в моем контексте - это объект модели на странице aspx.

Мы используем эту рабочую среду <% var model= Model as MyViewModel; %>.и используя модель, где мы должны использовать модель.Как заставить модель работать?

РЕДАКТИРОВАНИЕ

Это главные директивы

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/BaseViewMaster.Master" Inherits="System.Web.Mvc.ViewPage<Organization.Core.ViewModels.Models.MyViewModel>" %>

<%@ Import Namespace="Resources" %>
<%@ Import Namespace="Organization.Core.ViewModels.Models" %>

Мастер-страница:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<Organization.Core.ViewModels.Models.BaseViewModel>" %>
<%@ Import Namespace="Organization.Core.ViewModels.Models" %>

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Вы не должны пытаться создать модель в своем представлении. Вместо этого используйте соответствующий строго типизированный вид:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %>

Тогда просто обратитесь к Model по вашему мнению.

Если вам необходимо преобразовать модель домена EF в модель представления, выполните это в методе контроллера, либо вручную, либо с помощью чего-то вроде Automapper.

1 голос
/ 23 апреля 2013

Я только что столкнулся с той же проблемой после преобразования приложения MVC2 в MVC4.Проблема в моем случае была в файле Web.config в папке Views.Я создал новый проект MVC4 и скопировал по умолчанию Views / Web.config поверх моего существующего Views / Web.config, и это устранило проблему.

Я полагаю проблема была в<pages> узел, где некоторые номера версий не были равны 4. Я думаю, что pageParserFilterType из-за характера проблемы, но я не уверен в этом.На момент написания этой статьи с моей конкретной версией, вот как выглядит узел страниц, и он работает для меня:

<pages
    validateRequest="false"
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>
0 голосов
/ 09 ноября 2011

Вы глубоко, ужасно неправы, вы не должны приводить View к ViewModel , потому что он всегда будет возвращать false, null или выдает исключение.

В связанном примере, например, в любых типичных проектах, связанных с M-V-VM, классы, связанные с Model, View и ViewModel, находятся в ковариации ...

Итак, M, V, VM слабо связаны, поэтому нет общих корневых классов для преобразования.

  • class AbstractViewModel -> ... -> ViewModels * 1015 вашего представления (привязки пользовательского интерфейса, поведение, привязки данных)
  • class AbstractView -> ... -> Ваши Просмотры (страницы, экраны и т. Д.);
  • class AbstractModel -> ... -> Ваши Модели (алгоритмы, бизнес-уровень и т. Д.)

Эти иерархии, скорее всего, не будут находиться в одном дереве, за исключением базового класса объекта, поскольку это нарушит слабую связь и утратит идею отделения логики представления (презентатор, модель представления) от модели и визуального дизайна (представления, элементы управления)

В большинстве сред DI зависимости внедряются как общедоступные свойства только для чтения, поэтому попробуйте посмотреть (зависит от реализации MVP, MV-VM, MVC), например ((1) точка (2) означает только чтение) свойство (2) в классе с именем (1), некоторые из них могут быть также внутренними, поэтому недоступны:

  • ViewModel.View
  • ViewModel.Model
  • View.ViewModel
  • Model.ViewModel

Фактические имена свойств могут отличаться, но логика - нет.

В вашем случае вы, скорее всего, пропустили это свойство:

<% var model= Model.ViewModel as MyViewModel; %>. 

или

<% var model= (Model as MyModel).MyViewModel; %>. 

или просто

<% var model= MyModel.MyViewModel; %>. (if you are the  M-V-VM frameworks developer like me)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...