C# 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 {

我正在使用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 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