2013-05-28 4 views
7

Я пытаюсь передать данные с контроллера для просмотра. Я искал в Интернете, но не смог найти решение..net MVC, передающий данные linq с контроллера для просмотра

, если я делаю это работает:

Контроллер:

var yyy = (from a in Connection.Db.Authorities select a) ; 
ViewBag.data = yyy; 

Вид:

@foreach(var item in ViewBag.data) 
{ 
    @item.Value 
} 

Но следующий код не работает:

Контроллер:

var yyy = (from a in Connection.Db.Authorities select new {Value = a.Value, TypeCode = a.TypeCode, Return = Calculate(a.Return)}) ; 
ViewBag.data = yyy; 

Вид:

@foreach(var item in ViewBag.data) 
{ 
    @item.Value 
} 

Это дает «элемент не содержит определение для Value» для файла просмотра.

Любая помощь будет замечательной.

Спасибо.

-edited: обновлен второй запрос LINQ контроллера. и скорректировал первый запрос linq контроллера.

+0

На самом деле, я не понимаю, почему ваш * первый * код работает. Похоже, что он отображает 'a.Value.Value' для каждого' a'. –

+0

@justin вы правы, первый код не работает. теперь обновляется ... – isa

ответ

4

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

var yyy = (from a in Connection.Db.Authorities select a.Value); в

var yyy = (from a in Connection.Db.Authorities select a); 

ИЛИ изменить вид на

@foreach(var item in ViewBag.data) 
{ 
    @item 
} 

//////////////// //////////////////////////////// EDITS ///////////////// ///////////////////////////////
Чем нельзя использовать анонимный объект. Вы должны создать ViewModelClass. Для примера:

public class AuthoritiesViewModel 
     { 
      public string Value { get; set; } 
      public string TypeCode { get; set; } 
      public string Return { get; set; } 
     } 

И изменить ваш контроллер:

var yyy = (from a in Connection.Db.Authorities select new AuthoritiesViewModel{ Value = a.Value, TypeCode = a.TypeCode, Return = Calculate(a.Return)}); 
ViewBag.data = yyy; 

и на ваш взгляд, вы будете иметь возможность использовать:

<table> 
    <tr> 
     <th>Value</th> 
     <th>TypeCode</th> 
     <th>Return</th> 
    </tr> 
@foreach(AuthoritiesViewModel item in ViewBag.data) 
{ 
    <tr> 
     <td>@item.Value<td> 
     <td>@item.TypeCode<td> 
     <td>@item.Return<td> 
    </tr> 
} 
</table> 

Кроме того, у меня есть вопрос к Вам. Почему вы используете ViewBag для передачи данных с контроллера для просмотра? Почему вы не используете модель для передачи этих данных в соответствии с шаблоном MVC?

///////////////////////////////////////////// /// БОЛЬШЕ РЕДАКТИРОВАНИЯ ///////////////////////////////////////////// ///
Чтобы отправить несколько результатов запроса, вы можете создать более сложную модель.Например:

public class AuthoritiesViewModel 
     { 
      public string Value { get; set; } 
      public string TypeCode { get; set; } 
      public string Return { get; set; } 
     } 

     public class AnotherQueryViewModel 
     { 
      public string AnotherQueryValue { get; set; } 
      public string AnotherQueryTypeCode { get; set; } 
      public string AnotherQueryReturn { get; set; } 
     } 

     public class ModelClass 
     { 
      IEnumerable<AuthoritiesViewModel> Authorities { get; set; } 
      IEnumerable<AnotherQueryViewModel> AnotherQueryResults { get; set; } 
     } 

И изменить контроллер:

var yyy = (from a in Connection.Db.Authorities select new AuthoritiesViewModel{ Value = a.Value, TypeCode = a.TypeCode, Return = Calculate(a.Return)}); 

// do your another select 
var zzz = (from smthing select new AnotherQueryViewModel ...) 

// create model instance 
ModelClass model = new ModelClass() 
{ 
    Authorities = yyy.AsEnumerable(), 
    AnotherQueryResults = zzz..AsEnumerable() 
} 

// return view with model 
return View("view", model); 

и с точки зрения вы можете использовать:

@model ModelClass 

@*display first query result*@ 
<table> 
    <tr> 
     <th>Value</th> 
     <th>TypeCode</th> 
     <th>Return</th> 
    </tr> 
@foreach(AuthoritiesViewModel item in Model.Authorities) 
{ 
    <tr> 
     <td>@item.Value<td> 
     <td>@item.TypeCode<td> 
     <td>@item.Return<td> 
    </tr> 
} 
</table> 

@*display second query result*@ 
<table> 
    <tr> 
     <th>Another Query Value</th> 
     <th>Another Query TypeCode</th> 
     <th>Another Query Return</th> 
    </tr> 
@foreach(AnotherQueryViewModel item in Model.AnotherQueryResults) 
{ 
    <tr> 
     <td>@item.AnotherQueryValue<td> 
     <td>@item.AnotherQueryTypeCode<td> 
     <td>@item.AnotherQueryReturn<td> 
    </tr> 
} 
</table> 
+0

На самом деле я хочу написать следующий запрос linq, выбрать более 1 поля: из a в Connection.Db.Authorities выберите новый {Value = a.Value, TypeCode = a.TypeCode, Return = Calculate (a.Return)} – isa

+0

@isa, см. мои правки. – Dmytro

+0

Да, Дмитрий, вы правы, теперь это работает. Большое вам спасибо ... Проблема в том, что, как вы сказали, я должен создать класс viewmodelclass. И, отвечая на ваш вопрос, я хочу отправить более одного результата запроса для просмотра, поэтому я использую ViewBag вместо Model. – isa

0

использовать STH, как это

ViewBag.qualification = новый SelectList (db.Lookups.Where (x => x.lookup_type == "Квалификация"), "lookup_content", "lookup_content");

Смежные вопросы