C# MVC4最佳实践数据库模型v视图模型(传递到视图)

C# MVC4最佳实践数据库模型v视图模型(传递到视图),c#,entity-framework,asp.net-mvc-4,C#,Entity Framework,Asp.net Mvc 4,我想从一开始就养成好习惯,所以我有一个问题: 我一直在做以下工作,一直在工作,然后我读了这篇文章 以下是我一直在做的事情: 控制器 public ActionResult OneDollar130(Int32 number) { MyEDM db = new MyEDM(); MyDBModel model = db.MyTable.Where(t => t.Current == 1 && t.No == number).First(); retu

我想从一开始就养成好习惯,所以我有一个问题:

我一直在做以下工作,一直在工作,然后我读了这篇文章

以下是我一直在做的事情:

控制器

public ActionResult OneDollar130(Int32 number)
{
    MyEDM db = new MyEDM();
    MyDBModel model = db.MyTable.Where(t => t.Current == 1 && t.No == number).First();
    return View(model);
}
public ActionResult OneDollar112(Int32 TableNo)
{
    return View(new getOneDollar112Game(TableNo));
}
看法

模型

看法

@model MyProject.Models.getMyModel
@如果(Model.fldNo1==“”)
{
@ActionLink(“1”,“Number1”,“Number”,新的{model=model,Number=1},null)
}
其他的
{
@ActionLink(“1”,“Number2”,“Number”,新的{model=model,Number=1})
}
好的,我的两个问题是:

  • 哪一个是最佳实践。。。我之前所做的是否违反了不将DB模型传递给视图的规则

  • 如果第二种方法是正确的(我假设是正确的),为什么我不断地得到fldNo1不存在的错误


  • e、 g:CS1061:“MyProject.Models.getMyModel”不包含“fldNo1”的定义,并且找不到接受“MyProject.Models.getMyModel”类型的第一个参数的扩展方法“fldNo1”(是否缺少using指令或程序集引用?

    我也不喜欢将数据库对象用作模型

    我所做的是在我的项目中依赖MVC结构

    视图
    -包含视图

    模型
    -包含专用于视图的模型

    控制器
    -包含控制器,还负责在数据库和视图模型之间进行转换

    在我的控制器中,我添加了与数据库通信的存储库(请参阅)。如果我想在我的视图中显示一个用户,我会得到这样的结果

    public ActionResult Show()
    {
        // entity model
        var user = _userRepository.GetUserByName(User.Identity.Name);
    
        // translate to view model
        var model = new User
        {
            Name = user.Name,
            EmailAddress = user.EmailAddress
        }
        // Send the view model to the view
        return View(model);
    }
    
    这有用吗?

    1)我编辑了你的代码

    行动:

    public ActionResult OneDollar112(Int32 tableNo)
    {
        return View(new OneDollar112ViewModel(tableNo));
    }
    
    型号:

    public class OneDollar112ViewModel
    {
        private static MyEDM db = new MyEDM();
        private MyDBModel myModel;
    
        public string fldNo1 
        {
            get 
            { 
                return myModel == null
                    ? myModel.fldNo1
                    : null;
            }
    
            set 
            {
                // Your set logic here 
            }
        }    
    
        public OneDollar112ViewModel(Int32 number)
        {
            myModel = db.MyTable
                .Where(t => t.Current == 1 && t.No == numbner).SingleOrDefault();
        }
    }    
    
    视图:

    @model MyProject.Models.OneDollar112ViewModel
    @如果(Model.fldNo1==“”)
    {
    @ActionLink(“1”,“Number1”,“Number”,新的{model=model,Number=1},null)
    }
    其他的
    {
    @ActionLink(“1”,“Number2”,“Number”,新的{model=model,Number=1})
    }
    

    2) 您应该使用视图模型将业务逻辑与数据层分离,您可以将数据层封装在服务中,并在将来利用依赖项注入

    至少出于两个原因,您应该有单独的模型和视图模型:

    1.安全 MVC中的默认模型绑定器将使用任何匹配的post数据字段绑定到模型属性。这提供了一个安全整体,如果您的属性不打算更新,但在模型中(例如,使用通常不显示的属性名称伪造回发),则可以利用该安全整体进行攻击

    通过使用ViewModel并将每个必需属性从ViewModel显式传递到实际模型,您可以抵御此攻击向量

    2.复杂性 大多数合理的应用程序都需要每个视图有大量的模型和模型集合

    e、 g.基本的CRM客户视图可能有:客户详细信息,但不是分数、名称和电话号码列表、最近交易的摘要列表、注册产品列表等。这些可能存在于复杂的对象集合中,名称和电话号码在不同的模型中,最近的交易可能是订单号,订单行总数,仅前三个SKU代码等

    ViewModel允许您仅从模型和静态数据缓存中构建显示所需的部分和摘要。结果应该简化构建视图的工作流,并使其更易于测试


    从简单的ViewModels到实际使用的最终复杂的ViewModel通常有一条继承路径

    不确定为什么您认为代码应该毫无问题地运行。我看不到
    fdlNo1
    的任何定义。
    public ActionResult Show()
    {
        // entity model
        var user = _userRepository.GetUserByName(User.Identity.Name);
    
        // translate to view model
        var model = new User
        {
            Name = user.Name,
            EmailAddress = user.EmailAddress
        }
        // Send the view model to the view
        return View(model);
    }
    
    public ActionResult OneDollar112(Int32 tableNo)
    {
        return View(new OneDollar112ViewModel(tableNo));
    }
    
    public class OneDollar112ViewModel
    {
        private static MyEDM db = new MyEDM();
        private MyDBModel myModel;
    
        public string fldNo1 
        {
            get 
            { 
                return myModel == null
                    ? myModel.fldNo1
                    : null;
            }
    
            set 
            {
                // Your set logic here 
            }
        }    
    
        public OneDollar112ViewModel(Int32 number)
        {
            myModel = db.MyTable
                .Where(t => t.Current == 1 && t.No == numbner).SingleOrDefault();
        }
    }    
    
    @model MyProject.Models.OneDollar112ViewModel
    <table>
        <tr>
        @if (Model.fldNo1 == "")
        {
            <td class="numberTD">
                @Html.ActionLink("1", "Number1", "Number", new { model = Model, number = 1 }, null)
            </td>
        }
        else
        {
            <td class="numberTD2">
                @Html.ActionLink("1", "Number2", "Number", new { model = Model, number = 1 })
            </td>
        }
        </tr>
    </table>