2012-03-22 45 views
1

我有一个问题,我有一个控制器传递一个匿名类型到我的ASP.NET MVC视图

namespace RolesMVC3.Areas.Administrador.Controllers 
{ 
    [Authorize(Roles = "Adminr")] 
    public class HomeController : Controller 
    { 
     private BASEDATOSCJ_2Entities db = new BASEDATOSCJ_2Entities(); 
     public ActionResult Index() 
     { 
      string username = User.Identity.Name; 
      MembershipUser user = Membership.GetUser(username); 
      Guid key = (Guid)Membership.GetUser().ProviderUserKey; 

      var Universities = (from u in db.UNIVERSITy 
           join s in db.CAMPUS_UNIVERSITy on u.IdUniversity equals s.IdUniversity 
           join c in db.CIUDAD_CAMPUS on s.IdCiudadSede equals c.IdCiudadSede 
           join co in db.OFFICE on s.Idoffice equals co.Idoffice 
           join uxc in db.USERxOFFICE on co.Idoffice equals uxc.Idoffice 
           where uxc.UserId == key 
           select new { u.Name, namecity = c.Nombre, s.Idoffice}).ToList(); 
      return View(Universities); 
     } 

有了这个控制器我只是想送查看u.Name和s.Idoffice。我怎样做? (实际上不知道这个控制器是否正常),我想发送属于不同表的字段。我想发送查询作为列表,并在视图,ViewBag去与它?,如何将这些数据传递到视图和显示与foreach?。

我用剃刀

+0

http:// stackoverflow。COM /问题/ 5120317 /动态匿名类型的剃刀死因-runtimebinderexception – 2012-03-22 09:36:42

回答

1

我会用一个视图模型。我学会了不要将我的域对象暴露给视图,而是将我的域对象映射到视图模型并将此视图模型返回到视图。

将您的数据访问逻辑与您的查看逻辑分开。您可以将整个语句放入存储库类中,然后从控制器调用此方法。

这里是一个局部视图模型,如果你需要更多的数据来显示你可能有更多的属性:

public class UniversityViewModel 
{ 
    IEnumerable<University> Universities { get; set; } 
} 

大学类:

public class University 
{ 
    public string Name { get; set; } 
    public string Idoffice { get; set; } 
} 

在我控制我的操作方法是看起来像这样:

public ActionResult Index(int id) 
{ 
    UniversityViewModel viewModel = new UniversityViewModel 
    { 
      Universities = universityRepository.GetAll() 
    }; 

    return View(viewModel); 
} 

而在我看来,我会有以下g:

<table> 

@foreach(University university in Model.Universities) 
{ 
    <tr> 
      <td>Name:</td> 
      <td>university.Name</td> 
    </tr> 
} 

</table> 

这只是视图中数据的基本显示,您可以使用第三方组件来显示具有某些功能的数据。

+0

感谢朋友 我 '公共类大学 { 公共字符串名称{;组; } public int Idoffice {get;组; } }' 现在显示:不能隐式地将类型'decimal'转换为'int' 如何将decimal转换为int? – CADAVID 2012-03-22 15:26:15

+0

你从哪里得到这个错误?你有没有通过你的代码进行调试?某处有一个分配给整数的小数。看看你能找到它吗? – 2012-03-22 21:05:13

3

如果更改下面一行:

select new { u.Name, namecity = c.Nombre, s.Idoffice} 

select new { Name = u.Name, Idoffice = s.Idoffice } 

此只选择了两个字段到列表中。在你看来,你可以做到以下几点:

@model List<dynamic> 


@foreach(dynamic d in Model) { 
    <p>@d.Name</p> 
    <p>@d.Idoffice</p> 
} 

编辑:

您可能希望定义一个视图模型包含数据。

public class MyViewModel { 
    string Name {get;set;} 
    string Idoffice {get;set;} 
} 

现在你可以改变你的select声明如下:

select new MyViewModel { Name = u.Name, Idoffice = s.Idoffice } 

,并更新您Razor文件如:

@model List<MyViewModel> 


@foreach(MyViewModel d in Model) { 
    <p>@d.Name</p> 
    <p>@d.Idoffice</p> 
} 
相关问题