Динамический в MVC Views с похожими, но не теми же классами, что и Model - PullRequest
2 голосов
/ 22 сентября 2010

Допустим, у нас есть ASP.NET MVC View следующим образом:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<%: Html.EditorFor(model => model.ServiceDate) %>
<%: Html.ValidationMessageFor(model => model.ServiceDate, "*")%>

, и у нас есть классы Model, которые похожи, но не совсем одинаковы, например, Invoice и Quote, которыеоба содержат свойство ServiceDate.Эти два класса не наследуются от одного и того же базового класса, на самом деле в настоящее время у них нет базового класса.

  1. Как я могу заставить их наследовать от одного и того же базового класса, когда эти два сгенерированыEF?Если бы я мог это сделать, я мог бы заменить dynamic и указать базовый класс в качестве строгого типа представления.

  2. У меня сложилось впечатление, что это тот случай, когда dynamic был построен для.Но очевидно, что это не работает, потому что есть исключение, которое, очевидно, приходит из LINQ в EF:

    CS1963: Дерево выражений может не содержать динамическую операцию

Хотя это и такСкажите в редакторе VS 2010, что выражение будет разрешено во время выполнения, это не так, но по ошибке произойдет ошибка.

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

1) Классы, созданные Entity Framework, используют ключевое слово partial.Это означает, что вы можете легко расширять их и не беспокоиться о генерации кода, стирая ваши изменения.

Итак, допустим, EF генерирует: public partial class Customer

Что вы можете сделать, это определить другой файл .cs с именемCustomer_Partial.cs (просто мое личное предпочтение именования), а затем сделайте что-то вроде:

 public partial class Customer : IMySharedInterface
 {  
 }

Затем ваши страницы просмотра используют:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IMySharedInterface>" %>

и затем получают доступ к свойствам вашей модели в строго типизированном видеway.

2) Я думаю, это вызвано тем, что вы передаете IQueryable в ваше представление.Не уверен, хотя.С этим решением вам не придется беспокоиться об этом.

0 голосов
/ 22 сентября 2010

Прежде всего, какую версию EF вы используете?Я полагаю, вы используете EFv1, верно?Вы можете добавить наследование к своим моделям от EF.Все они определены как частные классы в рамках.Это означает, что вы можете создать другой класс с тем же именем (также частичным), который наследуется от базового класса.

Кстати, я рекомендую вам использовать ViewModels в этом случае.Избегайте использования наследования просто для повторного использования некоторых свойств, наследование следует использовать для добавления полиморфного поведения в ваши классы.

0 голосов
/ 22 сентября 2010

Кажется, вы пытаетесь использовать классы, сгенерированные EF, в ваших представлениях.Я бы порекомендовал вам , а не делать это.Это то, что должны делать ViewModels.Не бойтесь создавать модель представления для каждого вида (даже если вам пришлось повторить некоторые свойства) и избегайте передачи Модели.Также наличие представлений, которые строго напечатаны на <dynamic>, похоже на то, что вы имели слабо типизированные представления.Еще раз: избегайте их:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeAdaptedViewModel>" %>
<%: Html.EditorFor(model => model.ServiceDate) %>
<%: Html.ValidationMessageFor(model => model.ServiceDate, "*")%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...