【问题标题】:Update view's model or datatable for client updates?为客户端更新更新视图的模型或数据表?
【发布时间】:2012-09-08 12:51:38
【问题描述】:

在网页中,当用户从数据表中删除行时,我应该使用视图的模型还是数据表来进行数据操作? (我正在学习 MVC 4,我不确定访问模型是否会导致服务器受到攻击。)

这是我正在尝试做的一个简单示例。在我的控制器中,我返回了一些 Person 对象:

public ActionResult Index()
{
    List<Person> people = new List<Person>();
    people.Add(new Person() { Id = 1, FirstName = "Geddy", LastName = "Lee" });
    people.Add(new Person() { Id = 2, FirstName = "Alex", LastName = "Lifeson" });
    // more people here...

    return View(people);
}

这是我的视图引用人的方式(视图中的第一行):

@model List<MiscCommon.Entities.Person>

在我看来,我正在使用数据表来显示。那部分工作得很好。

在我的 javascript 函数中,当用户在表中的一行上点击删除(x)时,我成功地传递了 ID。但是,我不确定是否应该直接操作数据表(如下所示),或者是否应该修改@model然后刷新数据表。哪种方式被认为是正确的?或者还有其他我不知道的方法吗?

function RemovePerson(personIdToDelete) {
    var oTable = $('#tablePeople').dataTable();
    var rows = oTable.fnGetNodes();
    var rowToDelete;

    for (var i = 0; i < rows.length; i++) {
        var idFromCurrentRow = oTable.fnGetData(i, 1);  // ID column
        if (idFromCurrentRow == personIdToDelete) {
            rowToDelete = i;
        }                
    }

    oTable.fnDeleteRow(rowToDelete);
}

注意:我首先使用模型来填充表格:

@foreach (var person in Model) {
                @:$('#tablePeople').dataTable().fnAddData([@MvcHtmlString.Create(string.Format("'<a href=\"\", onclick=\"RemovePerson({0}); return false;\">x</a>'", @person.Id)), '@person.FirstName', '@person.LastName']);
            }

【问题讨论】:

    标签: javascript jquery asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您的@model 仅存在于服务器端。一旦 DOM 被渲染并发送到客户端,@model 就会被释放。您需要再次联系服务器以让数据库知道应该删除该记录。您有两种选择:

    选项一

    在您的 RemovePerson 函数中通过 AJAX 在 Javascript 中联系服务器。

    选项二

    将整个页面发布回服务器并解析结果。这将需要将您的表包装在 form 中,并为您的每一行输入一个输入。

    我更喜欢使用选项一并使用here 找到的jQuery.ajax() 方法。

    【讨论】:

      【解决方案2】:

      最好的方法是使用 ViewModel,这是您将传递给视图的内容。所以它变成了:

      Database -> Model -> Controller -> ViewModel -> View
      

      然后当用户更新或删除记录时:

      View -> ViewModel -> Controller -> Model -> Database
      

      换句话说,您将创建一个仅包含视图所需属性的 PeopleModel 类。

      【讨论】:

      • 那么,在我的 javascript 中编辑人员列表时,我应该编辑 @model(在视图中)还是数据表?而当你说 ViewModel 的时候,和视图中的@model 是一样的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多