我正在玩ASP.NET MVC 4,但我在理解方面遇到了一些问题。为了更好的解释,我将使用一个简单的“合成”情况。 假设我有2个属性的模型Person:
让我们在我的控制器中说我有私有财产人。我可以在Index方法中初始化这个对象,传入View并构建html页面。确定。
现在,当用户在客户端更新人员实例的一个字段时(他可以输入新的人名或使用下拉列表选择新的人员类型),我想立即更新我的模型。所以,我的一般问题是我如何实现它?
明显的解决方案:我可以使用新数据向JS发送一个ajax请求给控制器。我以为我可以调用控制器的方法UpdateName(字符串名称)并使用新数据手动更新属性Name。但是我的person实例在这个方法中是NULL!我的第二个问题是为什么我无法从其他方法访问已启动的模型对象?我认为这完全是因为我对客户端服务器交互的理解不够。
我的情况的最后一种情况:当用户点击“保存”按钮时,我想将创建的人员保存到服务器端的文件中,但我不想使用任何表单并在点击后立即接收所有需要的数据这个按钮(因为在我的实际任务中我不能使用表格,而且在点击按钮后我也无法从html页面接收所有需要的字段。)
我找到了肮脏的解决方案。在JS中,我创建了另一个具有相同属性的Person。现在我可以在需要时更新此类的实例,并将json数据传递给服务器以进行保存。
有没有更好的解决方案?
答案 0 :(得分:1)
为什么我无法从其他方法访问已启动的模型对象?
因为它不再被初始化了。不要使用控制器类来跨请求存储持久数据。在请求完成之后处理控制器对象,然后在新请求上重新初始化。因此,当您进入另一个操作方法时,一个操作方法在类级别保存的任何内容都将消失。从客户端到服务器的每个请求都应被视为完全隔离的事件,与以前的任何请求无关。
当您想保存模型时,您将在该操作中执行的操作是从数据库中重新获取它,应用更改并将其保存回数据库。
但我不想使用任何表格
我不确定你的意思。你的意思是你想使用AJAX而不是直接发布页面?如果是这样,那没关系。可能有很多工具可以帮助你,我个人经常只是创建一个表单而不是submit
按钮我有一个简单的button
并添加一些JavaScript代码(使用jQuery)序列化表单并执行AJAX POST。
只要POST值的键以与开箱即用形式相同的方式映射到模型字段,那么您的操作方法仍然可以接收正确的模型类型。在服务器端,无论是来自AJAX调用还是普通POST都无关紧要。但是,区别在于,AJAX调用的响应应该是JSON格式,而不是使用视图进行响应。
所以不要这样:
return View(someModel);
您可能会遇到以下情况:
return Json(someModel);
答案 1 :(得分:1)
让javascript对象代表你的模型并不是那么脏。事实上,我就是这样做的。我使用KnockoutJS给我一个客户端模型 - 这本质上是MVVM模式。
您正尝试以不可能的方式使用MVC模型。但是,您可以按照自己的意愿使用Knockout模型。您基本上有一个服务器端模型的javascript表示,一旦完成它,您将它发送到服务器。
为了让您的服务器端方法获取客户端模型,您只需确保post请求包含数据,并且只要属性名称在他们将匹配的方法的参数中相同。