【问题标题】:ASP.NET MVC 4 - Update Model from ViewASP.NET MVC 4 - 从视图更新模型
【发布时间】:2013-07-05 21:36:05
【问题描述】:

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

  • 字符串名称
  • PersonType 类型(例如 Student、Employee、Military...)

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

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

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

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

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

有没有更好的解决方案?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      但我不想使用任何形式

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

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

      所以不要这样:

      return View(someModel);
      

      你可能有这样的事情:

      return Json(someModel);
      

      【讨论】:

      • 大卫,感谢您提供非常有用的解释! “我不想使用任何表单”是指在我的实际项目中,我无法通过单击按钮从页面中收集所有需要的字段。我正在使用动态加载的部分视图,并且可以在单击按钮时从页面中删除某些字段。那么,我应该使用 JavaScript ViewModel 来获取始终最新的数据吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2013-10-30
      相关资源
      最近更新 更多