2011-12-07 58 views
2

我有一个ASP.NET MVC应用程序,非常沉重地使用ajax(jQuery)。在大多数情况下,用户永远不会离开页面 - 只是向控制器操作发出各种Ajax请求。在JavaScript中镜像C#模型 - ASP.NET MVC

通常,在制作ajax POST时,我将一个对象从JavaScript传递给控制器​​操作。在大多数情况下,我在JavaScript中创建的传递给控制器​​的对象也以C#模型的形式存在,所以我真的用JavaScript来镜像一些C#模型。

我的问题是 - 我是否在讨论这个错误?我担心的是我会在C#模型中更改一个属性名称,但忘记在JavaScript中更改它,直到它太晚并且用户发现它时才会知道它(我意识到单元测试会捕获很多这样的场景,但仍...)。

我正在考虑编写一些自动生成器来将我的一些C#类镜像为JavaScript - 但在进入所有这些废话之前,我想我会看看是否缺少明显的东西。

在此先感谢您的帮助!

编辑:

我使用ASP.NET MVC,所以当我进行AJAX POST到控制器,我从AJAX传递数据被自动解析成控制器的方法参数,只要它们具有同名。

回答

0

请使用合适的JSON串行器/解串器。

我为少数客户使用了Json.NET。 http://james.newtonking.com/pages/json-net.aspx

+0

是的,但数据来源于客户端(使用JavaScript)。我需要在JavaScript中创建一个具有类似命名属性的对象,以JSON格式发送给控制器,对吧?我可能会在这里错过一些基本的东西...... – MattW

+0

@MattW - 是的,但JavaScript使这个很简单。您只需使用JSON表示法创建一个对象。即'{a:1,b:2}'或任何您的对象被调用。 Json是JavaScript Object Notation的缩写,注意这里的术语“对象”。请参阅http://msdn.microsoft.com/en-us/library/bb299886.aspx –

+0

@Mystere感谢您的输入!我很熟悉JSON。问题是,如果我的C#模型有一个属性“a”(如你的例子),那么我必须在JavaScript中镜像该属性名称。如果我要在C#模型中更改属性名称“a”,则需要更改JavaScript中的JSON格式以镜像我的C#对象,否则数据将不会被ASP.NET MVC自动分析。我今天所做的是创建具有与我的C#类相同属性的JavaScript对象,并将其JSON格式传递给控制器​​。但是,如果属性名称发生更改,那么该属性将不再被解析 – MattW

1

退一步想一想。

你所做的一切就是通过HTTP发送一组键/值对作为数据。

你应该做的是将这些键/值对映射到服务器上的域对象/模型。

默认的映射可以是Model属性名称,但是当您更改模型属性名称时无法更改HTTP API。

这破坏了与使用您的HTTP API的任何人的兼容性,合同曾经是{foo:..},现在{bar:..}。

基本上,您通过将模型更改传播到HTTP API更改中而做错了。

你想要的是一个Model.from(HTTPData)工厂或其他种类的Model.manipulate(HTTPData)函数。

+0

我想我已经在此处列出了基本构思 - 但我在查看实际实现时遇到问题。假设我需要通过ajax POST(不一定在

)将2个值 - 名称和年龄 - 从JS传递到我的C#控制器。我们还假设我已经有一个叫做NameAgePair的C#模型,它只有这两个属性。在代码中看起来像什么(请相当漂亮)?感谢您一直以来的帮助! – MattW

+0

@MattW我所有的域对象都有一个['.construct'](https://github.com/Raynos/raynos-blog/blob/master/src/domain/post.js#L11)方法,它需要一个json数据并将其转换为真实的数据对象。如果我决定在我的域对象中将'content'更改为'text',我会更改[this line](https://github.com/Raynos/raynos-blog/blob/master/src/domain/post.js# L17)为'obj.text = post.content'。 – Raynos

+0

好的...所以你说你只是发送JSON数据到控制器,并让控制器决定如何将它解析成对象(C#模型)?在这种情况下,如果您在JS中更改JSON属性名称,您的C#模型会不会被正确填充?再次感谢! – MattW