Asp.net mvc ASP.NET MVC 4-从视图更新模型

Asp.net mvc ASP.NET MVC 4-从视图更新模型,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我正在玩ASP.NETMVC4,但是我在理解上有一些问题。为了更好地解释,我将使用一个简单的“合成”情况。 假设我有一个具有两个属性的模型人: 字符串名 人员类型(例如学生、员工、军人等) 比如说,在我的控制器中,我有一个私有财产的人。我可以在索引方法中初始化这个对象,传递到视图中并构建html页面。嗯 现在,当用户在客户端更新person实例的一个字段时(他可以输入新的人名或使用下拉列表选择新的人名类型),我想立即更新我的模型。因此,我的一般问题是如何实现它? 对我来说,显而易见的解决方案

我正在玩ASP.NETMVC4,但是我在理解上有一些问题。为了更好地解释,我将使用一个简单的“合成”情况。 假设我有一个具有两个属性的模型人:

  • 字符串名
  • 人员类型(例如学生、员工、军人等)
比如说,在我的控制器中,我有一个私有财产的人。我可以在索引方法中初始化这个对象,传递到视图中并构建html页面。嗯

现在,当用户在客户端更新person实例的一个字段时(他可以输入新的人名或使用下拉列表选择新的人名类型),我想立即更新我的模型。因此,我的一般问题是如何实现它?

对我来说,显而易见的解决方案是:我可以从JS向controller发送一个带有新数据的ajax请求。我认为我可以调用控制器的方法UpdateName(字符串名),并用新数据手动更新属性名。但是我的person实例在这个方法中是空的!我的第二个问题是为什么我不能从其他方法访问初始化的模型对象?我认为这都是因为我对客户机-服务器交互的理解不好

我的情况的最后一个例子是:当用户点击“保存”按钮时,我想将创建的人保存到服务器端的文件中,但我不想在点击这个按钮后使用任何表单并接收所有需要的数据(因为在我的实际任务中,我不能使用表单,也不能在单击按钮后从html页面接收所有需要的字段)

我找到了肮脏的解决方案。在JS中,我创建了另一个具有相同属性的类Person。现在我可以在需要时更新该类的实例,并将json数据传递给服务器以保存它

有没有更好的解决办法

为什么我不能从其他方法访问初始化的模型对象

因为它不再初始化。不要使用控制器类跨请求存储持久数据。控制器对象在请求完成后被释放,然后在新请求上重新初始化。因此,当您访问另一个操作方法时,一个操作方法在类级别保存的任何内容都将消失。来自服务器的客户端应被视为完全隔离的事件,独立于以前的任何请求

当您想要保存模型时,在该操作中要做的是从数据库中重新获取模型,应用更改,然后将其保存回数据库

但我不想使用任何形式

我不太清楚你在这里的意思。你是说你想使用AJAX而不是直接发布页面吗?如果是的话,那很好。可能有很多工具可以帮助你,就我个人而言,我通常只是创建一个表单,但我没有一个
提交
按钮,而是一个普通的
按钮
并添加一些JavaScript代码(使用jQuery)序列化表单并执行

只要POST值的键以开箱即用的形式映射到您的模型字段,那么您的操作方法仍然能够接收正确的模型类型。在服务器端,无论是来自AJAX调用还是普通POST,这都无关紧要。然而,区别在于AJAX调用的响应ld可能是JSON格式的,而不是用视图响应

因此,与此相反:

return View(someModel);
您可能会有这样的情况:

return Json(someModel);

让javascript对象来表示您的模型并没有那么脏。事实上,我就是这样做的。我使用KnockoutJS来为我提供一个客户端模型——本质上就是MVVM模式

您正试图以一种您无法使用的方式使用MVC模型。但是,您可以按照自己的意愿使用淘汰模型。您基本上拥有服务器端模型的javascript表示,一旦完成,您就可以将其发送到服务器


为了让您的服务器端方法获取您的客户端模型,您只需确保post请求包含数据,并且只要属性名称在方法的参数中相同,它们就会匹配自己。

David,感谢您提供了非常有用的解释!通过“我不想使用任何表单”我的意思是,在我的真实项目中,我不能通过单击按钮从页面收集所有需要的字段。我使用的是动态加载的局部视图,一些字段可以在单击按钮时从页面中删除。因此,我应该使用JavaScript ViewModel来获取始终最新的数据吗?