0

我正在使用 ASP.NET MVC 4,但我在理解上遇到了一些问题。为了更好地解释,我将使用一个简单的“合成”情况。假设我有具有 2 个属性的模型 Person:

  • 字符串名称
  • PersonType 类型(例如学生、雇员、军人...)

假设在我的控制器中我有私有财产 Person。我可以在 Index 方法中初始化这个对象,传递给 View 并构建 html 页面。好的。

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

对我来说明显的解决方案:我可以使用新数据从 JS 向控制器发送 ajax 请求。我认为我可以调用控制器的方法 UpdateName(string name) 并使用新数据手动更新属性 Name。但是我的 person 实例在这个方法中是 NULL !我的第二个问题是为什么我不能从其他方法访问初始化模型对象?我认为这完全是因为我对客户端服务器交互的理解不好。

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

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

有没有更好的解决方案?

4

2 回答 2

1

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

您正在尝试以您无法做到的方式使用 MVC 模型。但是,您可以根据需要使用 Knockout 模型。你基本上有一个服务器端模型的 javascript 表示,一旦你完成它,你就将它发送到服务器。

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

于 2013-07-05T21:44:22.980 回答
1

为什么我无法从其他方法访问已初始化的模型对象?

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

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

但我不想使用任何形式

我不太确定你在这里的意思。你的意思是你想使用 AJAX 而不是直接发布页面?如果是这样,那很好。可能有许多工具可以帮助您,就我个人而言,我经常只是创建一个表单,但submit我没有一个按钮,而是button添加了一些 JavaScript 代码(使用 jQuery)来序列化表单并执行AJAX POST

只要 POST 值的键以与开箱即用形式相同的方式映射到您的模型字段,那么您的操作方法仍然能够接收正确的模型类型。在服务器端,它是来自 AJAX 调用还是来自普通 POST 并不重要。但是,不同之处在于 AJAX 调用的响应可能应该是 JSON 格式,而不是使用视图进行响应。

所以代替这个:

return View(someModel);

你可能有这样的事情:

return Json(someModel);
于 2013-07-05T21:44:05.213 回答