1

在网页中,当用户从数据表中删除行时,我应该使用视图的模型还是数据表来进行数据操作?(我正在学习 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']);
            }
4

2 回答 2

1

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

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

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

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

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

于 2012-09-08T13:35:43.803 回答
1

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

选项一

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

选项二

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

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

于 2012-09-08T17:15:35.287 回答