3

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

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

这里

我一直在做的这个例子:

控制器

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);
}

看法

@model MyProject.MyDBModel
<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>

我正在使用我的 EDM 中的模型并将其传递给视图。

我在上面的帖子中读到我不应该将我的数据库模型传递给视图,因为这是不好的做法。这让我有些担心,因为我想做得对。

因此,基于上面的帖子,我将代码更改为进行实验并遇到了障碍:

控制器

public ActionResult OneDollar112(Int32 TableNo)
{
    return View(new getOneDollar112Game(TableNo));
}

模型

public class getMyModel
{
    MyEDM db = new MyEDM();
    public MyDBModel MyModel { get; set; }

    public getMyModel() { }
    public getMyModel(Int32 number)
    {
        MyModel = db.MyTable
            .Where(t => t.Current == 1 && t.No == numbner).First();
    }
}

看法

@model MyProject.Models.getMyModel
<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>

好的,所以我的两个问题是:

  1. 哪个是最佳实践……我之前所做的是否违反了不将数据库模型传递给视图的规则?

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

例如:CS1061:“MyProject.Models.getMyModel”不包含“fldNo1”的定义,并且找不到接受“MyProject.Models.getMyModel”类型的第一个参数的扩展方法“fldNo1”(您是否缺少 using 指令还是汇编参考?)

4

3 回答 3

4

我也不喜欢使用数据库对象作为模型。

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

Views- 包含视图

Models- 包含模型,专用于视图

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

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

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);
}

这有帮助吗?

于 2013-02-02T09:35:42.333 回答
1

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

1. 安全

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

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

2. 复杂性

大多数合理的应用程序将需要每个视图的大量模型和模型集合

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

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

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

于 2013-02-02T09:58:46.763 回答
0

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
<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>

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

于 2013-02-02T09:43:47.467 回答