3

我正在使用 ASP.NET MVC 3。我有一个问题是否可以更新模型,即使它没有被发送到控制器?也许问题已经完成,或者我以错误的方式做事?

我有一个对控制器方法的 ajax 调用。我正在传递一个ID。我希望控制器在数据库中找到一些东西,然后更新模型,将其传递回视图。

我有一个相当大的模型......我找到了一些解决方案,将模型转换为 javascript 对象,并将其发送到控制器。这是唯一/正确的方法吗?

如何在 jQuery $.ajax() 发布请求中向 MVC 控制器方法发送模型

我想也许控制器有模型,我可以在其中更新一些字段?

对控制器的调用:

    function getBis(id) {
        $.ajax({
            type: "GET",
            url: '@Url.Action("GetBis")',
            data: { "id": id },
            dataType: 'json',
            cache: false,
            success: function (data) {
                // Do something here
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert("Problem!");
            }
        });
    }

控制器代码:

    public ActionResult GetBis(string id)
    {
        BeslutIStortDTO viewModel = new BeslutIStortDTO();

        int theId;
        if (!Int32.TryParse(id, out theId))
            throw new Exception("Wrong id");

        viewModel = _blLayer.GetBIS(theId);

        // somehow update the model here!

        return View("index", viewModel);
    }
4

3 回答 3

0

通常,当您需要在不进行任何映射的情况下“反映”UI 上的任何更改时,您通常会在 JQuery 和控制器之间“传递模型”(MVC 足够聪明,可以根据您提供的参数构造一个新对象)。在你的情况下,你说你只需要传递一个 ID 就可以在你的模型上做一些事情。因此,您需要做的就是将 ID 作为参数传递,在控制器操作中获取它,然后执行您的操作。

看看下面的链接

使用 jquery ajax 将参数传递给控制器

于 2012-05-02T09:23:29.960 回答
0

简短的回答是“是”和“否”,具体取决于您的意思,但是您可能需要重新考虑您的设计。我猜您实际上是在尝试将域实体呈现到您的视图中,而不是视图模型。这是一个常见的新手错误。

我想澄清的一件事是域实体和视图模型之间的区别。

域实体通常是从您的持久层中提取的,这就是您的状态更改应该发生的地方。

视图模型是临时构造,在视图输出为 HTML 之前在服务器上创建,用作视图模板的数据仓库。它在请求后不存在于客户端的 Web 浏览器上,并且在请求后不再存在于服务器上。

如果您使用 Ajax 来执行某种类型的数据更改,而不是重新加载页面,那么您通常会做的是更改 Domain 对象(通过 Id),而不是您最初传入的 View Model(它不会'不存在了)。

例如。

我有一个与数据库记录绑定的域实体。Person {long id=1;string name=bob;bool enabled=true}

我有一个视图模型(我在初始获取控制器函数中映射到 bob)PersonData {long id=1;string name ="bob", enabled=true}

为此,在我的初始页面 GET 控制器函数中,我从数据库中提取域实体 bob,将他的数据复制到视图模型的实例,然后将视图模型传递给 View("EditPerson",pd)操作结果,它通过剃刀视图页面和视图模型,并将值替换为它正在写入响应流的 HTML(在适当的情况下)。

现在,您在客户端的 Web 浏览器上拥有 HTML,这就是 IT。不存在视图模型。现在您有一些 Ajax,它是浏览器端脚本,例如,当我单击“切换状态”链接时,浏览器(不更改页面)将向您提供的 ajax url 提交请求,传入一个鲍勃的 ID。然后,您的控制器函数应加载 Bob 的实体版本,并将 Bob 的启用的实体版本切换为适当的值,然后将该更改保存到数据库。

原始的 VIEW 模型根本没有发挥作用,因为自从初始页面呈现给浏览器以来,它就不存在了。

有没有什么具体的事情你想完成而你看不到这种模式的方法?

于 2012-05-03T19:24:22.957 回答
0

首先更新模型,你的意思是要更新数据库中的记录吗?这不是在获取请求中做的好习惯。如果不继续阅读..

使用 GetBis 方法获得对象后,您可以更改它的所有属性。

如果您想将此对象发送到 Javascript,请使用 JSON 结果。

return JSON(viewModel);

还有一件事,不要在第一行代码中初始化视图模型,不必要的对象分配。

于 2012-05-02T09:30:58.140 回答