C# MVC4Razor-使用DisplayFor而不是ID显示字典中的名称
我正在使用MVC4Razor来呈现一个简单的网页,我想知道是否有一种简单的方法可以使用DisplayFor来呈现一个“转换”的值,而不是显示模型的ID值 型号:C# MVC4Razor-使用DisplayFor而不是ID显示字典中的名称,c#,razor,asp.net-mvc-4,displayfor,C#,Razor,Asp.net Mvc 4,Displayfor,我正在使用MVC4Razor来呈现一个简单的网页,我想知道是否有一种简单的方法可以使用DisplayFor来呈现一个“转换”的值,而不是显示模型的ID值 型号: public class Property { [Key] public int Rec_Id { get; set; } public string Name { get; set; } public int TypeId { get; set; } } public class Type {
public class Property
{
[Key]
public int Rec_Id { get; set; }
public string Name { get; set; }
public int TypeId { get; set; }
}
public class Type
{
public int TypeId { get; set; }
public string TypeName { get; set; }
}
public ActionResult Index()
{
PropertyContext db = new PropertyContext();
Property model = db.Property.Find(94284);
ViewBag.cmbType = db.Type.ToList();
return View(model);
}
控制器:
public class Property
{
[Key]
public int Rec_Id { get; set; }
public string Name { get; set; }
public int TypeId { get; set; }
}
public class Type
{
public int TypeId { get; set; }
public string TypeName { get; set; }
}
public ActionResult Index()
{
PropertyContext db = new PropertyContext();
Property model = db.Property.Find(94284);
ViewBag.cmbType = db.Type.ToList();
return View(model);
}
查看
<div class="display-field">
@Html.DisplayFor(ViewBag.Type => ViewBag.Type.Find(model.Type).TypeName)
</div>
@DisplayFor(ViewBag.Type=>ViewBag.Type.Find(model.Type.TypeName)
我建议您使用视图模型,因为您的域模型不适合需要显示类型名称的视图要求:
public class MyViewModel
{
public int RecId { get; set; }
public string Name { get; set; }
public string TypeName { get; set; }
}
然后让控制器操作通过执行内部联接来填充此视图模型,并将其传递给视图:
public ActionResult Index()
{
using (PropertyContext db = new PropertyContext())
{
var query =
from prop in db.Property.Find(94284)
join type in db.Type on prop.TypeId equals type.TypeId
select new MyViewModel
{
RecId = prop.Rec_Id,
Name = prop.Name,
TypeName = type.TypeName
};
var viewModel = query.FirstOrDefault();
return View(viewMode);
}
}
最后,您的视图将被强类型化为视图模型,您将拥有所有需要显示的信息:
@model MyViewModel
...
<div class="display-field">
@Html.DisplayFor(model => model.TypeName)
</div>
@model MyViewModel
...
@DisplayFor(model=>model.TypeName)
ViewBag.Type=>ViewBag.Type.Find(model.Type).TypeName
-这是什么?我会对此提出质疑。就我们在这个特定示例中所知,似乎不需要viewmodel的额外开销。相反,我建议他引入一个数据访问层,从他的数据上下文映射到一个模型,然后他可以使用该模型绑定到视图。这保留了经典的MVC架构,并允许DAL代码的可重用性,这些代码可以永久保存到其他控制器/操作中。也就是说,我确实认为您的解决方案是朝着正确方向迈出的一步。相反,我建议他引入一个数据访问层,将其从数据上下文映射到一个模型,然后他可以使用该模型绑定到视图
——完全不同意这一点。永远不要将视图特定的模型放入数据访问层。这样,您将DAL与视图紧密耦合,使它们的可重用性受到质疑。正确的方法是让视图模型专门绑定到MVC应用程序的视图部分。我喜欢将视图模型视为对数据执行操作以塑造数据的区域,而不仅仅是所述数据的映射。您的视图模型可能是一个非常简单的视图模型,可以称为另一个模型:P并且足够公平,您可以避免紧耦合。当我看到在控制器中执行数据访问时,我会畏缩。这里的命名并不重要。你的建议是把视图特定的东西(比如TypeName)放到DAL中,我不同意。我第一次错过了TypeName。在这种情况下,我撤销了我的反对意见。没有理由让它进入DAL