Динамический введенный ViewPage

Нет, Вы не можете назвать одного конструктора от другого в C++ 03 (названным конструктором делегирования).

Это изменилось в C++ 11 (иначе C++ 0x), который добавил поддержку следующего синтаксиса:
(пример, взятый от Википедия )

class SomeType
{
  int number;

public:
  SomeType(int newNumber) : number(newNumber) {}
  SomeType() : SomeType(42) {}
};

12
задан Matthew Groves 24 July 2009 в 17:52
поделиться

2 ответа

Анонимные типы не могут быть возвращены методом; они действительны только в рамках метода, в котором они определены.

Вы должны использовать класс Model, который вы определили ранее, и передать его вашему View. Нет ничего плохого в передаче класса Model, в котором определены не все поля.

Обновление :

Я думаю, что раньше был неправ. Это должно сработать. Возможно, проблема в View. Вы можете разместить больше кода? Особенно View и его конструктор.

Обновление второго:

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

Но я также ошибался, полагая, что то, что вы пытаемся сделать бы работу. К сожалению для вас, этого не произойдет. Проблема в том, что вы используете ViewPage , который использует внутри ViewDataDictionary . Поскольку для них требуются строгие типы, вы не сможете использовать с ними динамические объекты. Внутренняя структура просто не использует динамическое внутренне, и определение динамического типа не работает.

Что потребуется, так это класс DynamicViewPage и соответствующий класс DynamicViewDataDictionary , которые принимают объект и хранят его внутри как динамический. Затем вы можете использовать анонимный тип и передать его своим представлениям.

Тем не менее, вы ничего не получите. Вы можете указать свои представления, как вы это сделали (т.е. <% = Model.Name%> ), но строгая типизация не принесет вам пользы. Не было бы никакого intellisense и не было бы безопасности типов. Вы' d с тем же успехом может использовать нетипизированный ViewDataDictionary , как предлагает @Dennis Palmer.

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

7
ответ дан 2 December 2019 в 20:18
поделиться

Какую выгоду вы надеялись получить от использования здесь динамического типа?

Использование словаря ViewData - очень простой способ добавления произвольных объектов / элементов в вывод вашего представления.

Вам не нужно отражение, чтобы получить имена свойств в вашем представлении. Просто используйте ViewData.Keys , чтобы получить коллекцию имен.

Изменить: Я только что узнал немного больше о динамике, и я думаю, что, возможно, вам нужно создать свой собственный класс динамических объектов который наследуется от DynamicObject . Вы захотите иметь частный словарь в этом классе, а затем переопределить TrySetMember и TryGetMember .

Отредактировать в сторону: Я думаю, что одно из преимуществ строго типизированной ViewModel - что вы можете принять его как параметр в ваших методах действия POST. Платформа MVC будет обрабатывать привязку модели, а в методе действия у вас просто будет экземпляр вашего класса ViewModel. Я не думаю, что у вас будет такое преимущество с динамическими, даже если они действительно работают.

Результат редактирования: Ну, я пробовал использовать класс, производный от DynamicObject, но VS2010 вылетает при попытке визуализировать представление . У меня нет никаких исключений, просто вылетает и Visual Studio перезагружается. Вот код, который я придумал и который вызывает сбой.

Пользовательский динамический класс:

public class DynViewModel : DynamicObject
{
    private Dictionary<string, object> ViewDataBag;
    public DynViewModel()
    {
        this.ViewDataBag = new Dictionary<string, object>();
    }
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        this.ViewDataBag[binder.Name] = value;
        return true;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = this.ViewDataBag[binder.Name];
        return true;
    }
}

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

public ActionResult DynamicView()
{
    dynamic p = new DynamicViewModel.Models.DynViewModel();
    p.Name = "Test";
    p.Phone = "111-2222";

    return View(p);
}

Мое мнение в основном такое же, как и в вопросе:

<p>Name: <%=Model.Name %></p>
<p>Phone: <%=Model.Phone %></p>

Мое заключение: Это может сработать, но в бета-версии 1 VS2010 я не могу понять, почему мой код вызывает сбой Visual Studio. Я' Я попробую это сделать еще раз в VS2010 Beta 2, когда он выйдет, потому что это интересное упражнение для изучения динамики. Однако, даже если бы это сработало, я все равно не вижу никаких преимуществ перед использованием словаря ViewData.

Фил Хаак спешит на помощь! Вот запись в блоге Фила Хаака, которая может вам помочь. Похоже, это то, что вы искали. Забава с отсутствующим методом и C # 4

7
ответ дан 2 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: