在控制器中更新模型?

时间:2012-05-02 09:15:25

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

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

我对控制器方法进行了ajax调用。我正在传递身份证。我希望控制器在db中找到一些东西,然后更新模型,将其传递回视图。

我有一个非常大的模型......我找到了一些解决方案,将模型转换为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);
    }

3 个答案:

答案 0 :(得分:0)

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

查看以下链接

Pass a parameter to a controller using jquery ajax

答案 1 :(得分:0)

首先更新模型,您的意思是要更新数据库中的记录吗?在get请求中这不是一个好习惯。如果没有阅读..

使用GetBis方法获取对象后,可以更改其所有属性。

如果要将此对象发送到Javascript,请使用JSON Result。

return JSON(viewModel);

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

答案 2 :(得分:0)

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

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

通常从持久层中提取域实体,这是应该进行状态更改的位置。

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

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

例如。

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

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

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

现在,您在客户端的Web浏览器上拥有HTML,即IT。没有视图模型。现在你有一些Ajax是浏览器端脚本,例如当我点击“切换状态”链接时,会发生什么是浏览器(不更改页面)将向你提供的ajax url提交请求,传入鲍勃的身份。然后,您的控制器功能应加载Bob的实体版本,并将启用的Bob的实体版本切换为适当的值,然后将该更改保留到数据库。

最初的VIEW模型无处可去,因为自从初始页面呈现给浏览器以来它一直不存在。

你有没有想要完成的具体事情,你无法看到这种模式的方法?