Подтвердить что ты не робот

Могу ли я передать анонимный тип моему представлению ASP.NET MVC?

Я только начал работать с ASP.NET MVC теперь, когда он в бета-версии. В моем коде я запускаю простой запрос LINQ to SQL, чтобы получить список результатов и передать его моему представлению. Такого рода вещи:

var ords = from o in db.Orders
           where o.OrderDate == DateTime.Today
           select o;

return View(ords);

Однако в моем представлении я понял, что мне нужно получить доступ к имени клиента для каждого заказа. Я начал использовать o.Customer.Name, но я уверен, что он выполняет отдельный запрос для каждого заказа (из-за ленивой загрузки LINQ).

Логичным способом сокращения количества запросов было бы выбрать имя клиента одновременно. Что-то вроде:

var ords = from o in db.Orders
           from c in db.Customers
           where o.OrderDate == DateTime.Today
               and o.CustomerID == c.CustomerID
           select new { o.OrderID, /* ... */, c.CustomerName };

return View(ords);

Кроме того, моя переменная ords является IEnumerable анонимного типа.

Можно ли объявить ASP.NET MVC View таким образом, что он принимает IEnumerable в качестве своих данных представления, где T определяется тем, что передается от контроллера, или мне нужно определить конкретный тип для заполнения из моего запроса?

4b9b3361

Ответ 1

Вы можете передать его в представление? Да, но ваш взгляд не будет строго типизирован. Но помощники будут работать. Например:

public ActionResult Foo() {
  return View(new {Something="Hey, it worked!"});
}

//Using a normal ViewPage

<%= Html.TextBox("Something") %>

Это текстовое поле должно отображать "Эй, это сработало!" как значение.

Итак, вы можете определить представление, где T определяется тем, что передается ему с контроллера? Ну да, но не во время компиляции.

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

Как вы получите Intellisense для того типа, которого вы еще не знаете? Контроллер может передать любой тип в представление во время выполнения. Мы даже не можем анализировать код и догадываться, потому что фильтры действий могут изменять объект, переданный в представление, для всех, что мы знаем.

Надеюсь, что это прояснит ответ, не запутывая его больше.:)

Ответ 2

Вы можете передавать анонимные типы в представление, просто не забудьте применить модель к динамическому.

Вы можете сделать следующее:

return View(new { 
    MyItem = "Hello", 
    SomethingElse = 42, 
    Third = new MyClass(42, "Yes") })

В верхней части окна вы можете сделать это (используя здесь бритву)

@{
    string myItem = (dynamic)Model.MyItem;
    int somethingElse = (dynamic)Model.SomethingElse;
    MyClass third = (dynamic)Model.Third;
}

Или вы можете отбросить их из ViewData следующим образом:

@{
    var myItem = ViewData.Eval("MyItem") as string
    var somethingElse = ViewData.Eval("SomethingElse") as int?
    var third = ViewData.Eval("Third") as MyClass 
}

Ответ 3

В .NET 4.0 Анонимные типы могут быть легко преобразованы в ExpandoObjects, и, следовательно, все проблемы устраняются с накладными расходами самого преобразования. Проверьте здесь

Ответ 4

Для чего сегодня, я обнаружил класс DataLoadOptions и его LoadWith. Я смог сообщить LINQ в SQL DataContext, чтобы всегда загружать строку Customers каждый раз, когда извлекается строка Orders, поэтому исходный запрос теперь получает все, что мне нужно, за один удар.

Ответ 5

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

Спасибо

Ответ 6

Этот post показывает, как вы можете вернуть анонимный тип из метода, но он не подходит вашим требованиям.

Другой вариант может состоять в том, чтобы вместо этого преобразовать анонимный тип в JSON (JavaScriptSerializer сделает это), а затем вернуть этот JSON в представление, вам понадобится jQuery и т.д., чтобы делать то, что вам нравится.

Я использую Linq для "форматирования" моих данных в формате JSON, который мне очень нравится в представлении.

Ответ 7

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

Ответ 8

вы можете передать объект и использовать отражение, чтобы получить желаемые результаты. Посмотрите на ObjectDumper.cs(включенный в csharpexamples.zip) для примера этого.

Ответ 9

Если я не ошибаюсь, анонимные типы преобразуются в строго типизированные объекты во время компиляции. Является ли строго типизированный объект действительным для данных просмотра, это еще один вопрос.

Ответ 10

У меня с той же проблемой... немного подумав, я пришел к выводу, что самое правильное и масштабируемое решение, чтобы его сериализовать этот анонимный тип перед отправкой в ​​представление. Таким образом, вы можете использовать тот же метод, чтобы заполнить страницу с помощью кода "Просмотр" и заполнить страницу с помощью JSON