【发布时间】:2011-08-15 11:30:04
【问题描述】:
问题概述:
我想在我的表单中加入一些条件逻辑。用户使用单选按钮进行选择,根据选择我想隐藏一些字段并显示其他一些字段。这也应该影响验证(不应该验证隐藏的字段)。我认为这是一个典型的问题,但我找不到任何示例,而且我自己的解决方案似乎有很多麻烦。
我的实际问题:
让我们从 viewmodel 类开始(为了这个问题的需要做了一些简化):
public class Scenario
{
public Request Request { get; set; }
public Response Response { get; set; }
// … some other properties
}
public class Request
{
//some properties
}
public class Response
{
[Required]
public string ResponseType { get; set; }
[Required]
public string State { get; set; }
[Required]
[NotZero] //this is my custom validation attribute
public string ErrorCode { get; set; }
public string ErrorDescr { get; set; }
}
在Scenario 模型的创建/编辑视图中,我有一个由3 个选项卡组成的相当大的表单。在第三个选项卡上,我显示了基于 Response 模型的局部视图。这就是我想要条件逻辑的地方。 ResponseType 属性是表单上的单选按钮。它可以有两个值:NORMAL 和 ERROR。在 ERROR 的情况下,我想显示和验证 ErrorCode 和 ErrorDescr 属性。在 NORMAL 的情况下,我只想显示和验证 State 属性。
我的解决方案:
- 在响应部分视图中,我有一些 jquery .hide() 和 .show() 调用连接到隐藏/显示相关的输入元素。
- 我修改了 jquery 不显眼的验证脚本以阻止它验证隐藏字段 (http://blog.waynebrantley.com/2011/01/mvc3-validates-hidden-fields-using.html)
-
在场景控制器中,我有这样的代码:
public ActionResult Edit(int id, Scenario scenario) { Response response=scenario.Response; if (response.ResponseType != null) { if (response.ResponseType == "NORMAL") { //in this case remove validation for errorcode this.ModelState.Remove("Response.ErrorCode"); } else { //in this case remove validation for state this.ModelState.Remove("Response.State"); } } if (ModelState.IsValid) { //map to entity and save to database } }
这是一大堆丑陋的管道(尤其是控制器代码 - 使用字符串键从 ModelState 中删除项目...没有类型安全等),肯定有更好的方法吗?
【问题讨论】:
标签: asp.net-mvc-3