问题标签 [modelbinders]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3495 浏览

asp.net-mvc - 在 ASP.Net MVC 中使用模型绑定更新父/子记录

我已经修改了Nerd Dinner应用程序以允许通过将以下代码添加到 DinnerForm.ascx 来编辑子记录

它正在渲染:

我没有修改 DinnersControler 的 Post Edit Action 方法。家长晚餐照常更新,但显示为 UpdateModel(dinner); 未查看/更新子 RSVP 记录。

我已经尝试了一些渲染子记录的变体,以便模型活页夹可以看到集合,但没有运气。

通过调用 UpdateModel(Parent) 一次性更新父/子记录;可以使用当前的模型粘合剂吗?

0 投票
2 回答
447 浏览

asp.net-mvc - 如何在 ASP.NET MVC 的同一页面中使用相同 .ascx 的两个实例?

Address.ascx我在 ASP.NET MVC 页面中有两个控件实例。

当然,使用与此完全相同的代码,我最终会为地址中的每个字段提供相同的 ID。我可以很容易地将一个字符串附加到字段的 ID 中,所以我有'Street1_billing'and 'Street1_shipping',但我不清楚如何将它映射到模型。

将模型映射到项目数组的最佳解决方案是什么(在这种情况下只有 2 个)。我不知道有任何 ASP.NET 的“开箱即用”解决方案。

注意:这与这个问题有点相似,我可以使用Scott Hanselman 的这个解决方案,但这并不是我想要的。就我而言,我知道我有两个项目,所以它本质上是一个 2 项目数组,但我想知道是否有更优雅的解决方案。

PS。我敢肯定这已经被问过很多次了,但我似乎无法输入正确的搜索词。如果您知道受骗,请链接此问题!

0 投票
1 回答
277 浏览

asp.net-mvc - 如果我需要从自定义模型绑定器中检索对象,绑定器应该与服务层、存储库层还是...交互?

如果我有类似的课程:

当我创建自定义模型绑定器时,我的表单中的 Post 不会发送到 Pet,它会发送如下数据: firstName: "myFirstName" lastName: "myLastName" myPet: "myPetsName"

由于传入的是 Pet 的名称,而不是实际的 Pet 对象,因此需要从模型绑定器中检索 Pet 对象。

我的问题是,模型绑定器应该与服务层、存储库层交互,还是应该检索宠物?服务层的问题是我在初始化服务时似乎无法访问 ModelState:((this.ModelState)给我一个错误)

如果我需要模型绑定器来创建一个 Person 对象,那么需要以某种方式分配 Pet ......我应该怎么做?

0 投票
2 回答
883 浏览

asp.net-mvc - ASP.NET MVC - 模型绑定的测试页面

我有涵盖我的模型绑定器的单元测试。我创建一个 ModelBindingContext 并用我的测试值填充 ValueProviderDictionary。我有信心,一旦我的控制器获得模型,一切都被测试覆盖,正确的事情正在发生。我也有信心,如果 BindingContext 正确,我的模型将正确绑定。我没有信心的是,我的视图在回发时会正确填充 BindingContext。

我已经开始编写WatiN 测试来填写表格,将它们发回,然后检查生成的视图。这没关系,但似乎非常……间接。例如,点击提交后显示“您的订单已保存”的页面——我必须访问数据库以查看它是否已正确保存。我已经有测试,当传递给我的控制器的模型是 x 时,y 被保存到数据库中。为什么我在视图测试中重复此代码?

我真正想要的是填充视图,点击提交,然后检查 (a) BindingContext 或 (b) 从 ModelBinder 返回的模型。

有没有关于如何做这些事情的做法?


只是想补充一点,这将是 WatiN 测试的补充。我现在有大约 50 个 WatiN 测试(还有很多要添加),如果我可以在没有 WatiN 的情况下执行上述操作,它只会删除少数测试。我会继续使用 WatiN 来做它的好处,但我觉得我现在正在滥用它来进行那些少数测试。

0 投票
2 回答
1268 浏览

asp.net-mvc - 在 asp.net mvc 中使用 viewmodel 和 modelbinder 时下拉值 null

从视图发布时,我正在使用 asp.net 的 modelbinder 功能将表单值绑定到我的实体。

html 使用正确的选项和值项在初始视图中正确呈现。

填写表格并发布时,所有值都正确填充到实体中,下拉列表中的值除外。不知道我做错了什么。

下面附上代码:

客户实体:

视图模型:

控制器:

看法:

0 投票
3 回答
1803 浏览

asp.net-mvc - ASP.NET MVC 2 中空查询字符串参数的模型绑定

此处描述的行为现在似乎是 ASP.NET MVC 2 的默认行为(至少对于预览版 1)。

当对这样的查询字符串进行建模时:

发生以下绑定(假设您绑定到具有 'Foo' 和 'Bar' 字符串属性的模型)

ASP.NET MVC 1

ASP.NET MVC 2(预览 1 到 RC)

想给任何正在玩 V2 的人提个醒,因为“ gu-notes ”中没有提到这一点。也很好奇是否有知情人士可以评论这是否将是最终实现或可配置功能?无论哪种方式我都很好,但只是希望他们不要切换回旧方式!可配置会更好。

编辑:从这一点学到的教训是,无论您开发的版本是什么,都不要编写代码 Foo.Length == 0 来测试空字符串或 Foo.Length > 3 来检查最小长度。使用 string.IsNullOrEmpty(Foo) 和/或首先检查 null。


更新:这个问题引发了我的好奇心,他们为什么会做出这种改变。我认为我在研究禁用控件时偶然发现了答案。W3 HTML 规范定义了一个“成功控制”,如下所示:

一个成功的控件对于提交是“有效的”。每个成功的控件都将其控件名称与其当前值配对,作为提交的表单数据集的一部分。成功的控件必须在 FORM 元素中定义,并且必须具有控件名称。

换句话说 - 一个成功的控制是将它作为查询字符串参数返回到服务器的控制。现在,如果控件没有有效值,则根据规范:

如果在提交表单时控件没有当前值 ,用户代理不需要将其视为成功的控件。

(在这里用“不需要……”来发现“开放解释”的语言)

因此,我认为通过发送 null 而不是空字符串,它可以减少某些浏览器可能发送Foo=&Bar=而其他浏览器甚至可能不发送该查询字符串参数的浏览器不兼容性。总是解释Foo=为好像 Foo 根本不在那里,这会迫使你更加防御。

我认为我至少对于这里的原因是正确的 - 至少部分与“成功控制”的概念有关。

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

0 投票
1 回答
2489 浏览

asp.net-mvc - ASP.NET MVC 框架中的 MVVM 和 ModelBinders

我有一系列视图,每个视图都有自己的 ViewModel 类,其中包含他们需要展示自己的所有内容,例如:

我想使用的 post 操作方法如下所示:

请注意,我感兴趣的唯一对象是 CreateResourceViewModel 的 Resource 属性,而不是 CreateResourceViewModel 本身。其他一切对用户来说只是肉汁,他们正在更新的是资源类......

这在 MVC 框架中是否可行(即使它是 v2 CTP)?

谢谢大家

0 投票
3 回答
596 浏览

asp.net-mvc - ASP.NET MVC、LINQ 和 ModelBinders

是否有一个预构建的 ModelBinder 可以与 LINQ 一起使用以从 DataContext 获取对象并在 HTTP 帖子上更新它?

例如,目前我有这段代码:

(IProjectService 封装了对 LINQ 数据上下文的调用)

为了通过 LINQ 数据上下文实际执行对数据库的更新,我需要再次获取项目实例,然后更新该实例。

任何尝试简单地保存项目实例而不首先从数据上下文中获取它都会导致没有任何内容被写回数据库 - 我假设因为 LINQ 数据上下文对它不做任何事情的对象一无所知。

顺便说一句,在 Projects 表类上使用 Attach 方法也不起作用,它会引发异常。

0 投票
3 回答
375 浏览

asp.net-mvc - 如何 [以及在何处] 使用 ModelBinder 实现验证

我正在使用 ASP.NET MVC、MySQL 和 NHibernate 开发一个小站点。

我有一个联系人类:

和模型粘合剂:

另外,我有一个带有表单的视图来更新我的数据库,使用这个操作:

到这里为止,一切正常。但在更新我的联系人之前,我必须执行表单验证。

我的问题是:我应该在哪里实施此验证?在 ActionResult 方法中还是在 Model Binder 中?还是其他地方?

非常感谢。

0 投票
1 回答
1951 浏览

asp.net-mvc - Extending Sanderson's custom mvc ModelBinder for an object stored in session

In his wonderful MVC book Steven Sanderson gives an example of a custom model binder that sets and retrieves a session variable, hiding the data storage element from the controller.

I'm trying to extend this to cater for a pretty common scenario: I'm storing a User object in the session and making this available to every action method as a parameter. Sanderson's class worked ok when the User details weren't changing, but now i need to let the user edit their details and save the amended object back to the session.

My problem is that I can't work out how to distinguish a GET from a POST other than by checking the number of keys in bindingContext.ValueProvider.Keys, and this seems so wrong I'm sure I'm misunderstanding something.

Can anyone point me in the right direction? Basically all Actions need access to the current user, and the UpdateMyDetails action needs to update that same object, all backed by the Session. Here's my code...