【问题标题】:Updating the model in the controller?更新控制器中的模型?
【发布时间】:2012-05-11 18:07:26
【问题描述】:

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

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

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

How to send a model in jQuery $.ajax() post request to MVC controller method

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

对控制器的调用:

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

【问题讨论】:

  • 你想做什么?您要更新什么型号?在您触发 AJAX 请求时,用于呈现视图的模型早已不复存在。
  • 这就是我所害怕的。我想在我的模型中添加额外的东西,这个模型最初是用来渲染视图的。
  • 此模型不再存在。您可以查询您的数据库以直接在那里更新它。
  • 您打算如何使用该模型?你打算用 HTML 更新视图,你打算用 javascript 操作返回的数据吗?

标签: c# asp.net-mvc view controller


【解决方案1】:

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

看看下面的链接

Pass a parameter to a controller using jquery ajax

【讨论】:

  • 我正在使用 id 来获取我想要发送回视图的内容。向模型添加额外数据。
【解决方案2】:

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

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

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

return JSON(viewModel);

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    例如。

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

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

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

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

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

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

    【讨论】:

    • 我做的和你描述的一样,使用视图模型。我将再描述一下我的情况:在第一次获取(索引)中,我使用 viewModel 在选择列表等中填充“大量”数据。但是,还有更多的数据要获取,这取决于用户在第一次获取后做了什么。然后他做了一些事情,我做了一个 ajax 调用,并希望将更多数据“填充”到 viewModel(而不是再次获取所有数据)。这是(可能)一种特殊情况,我想(至少)分两步填充 viewModel,具体取决于用户的操作。我现在已经用纯 javascript 解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多