绕过MVC验证获取请求

时间:2011-05-19 23:39:50

标签: .net asp.net-mvc

我的控制器中有这个代码:

[HttpGet]
public ActionResult Register(UserRegistrationModel model)
{
    return View();
}

我这样做的原因是因为可以使用从其他页面生成的查询字符串中预先填充“注册”页面。

问题在于,当我的视图被渲染时,它会显示验证错误......有没有办法绕过它?

3 个答案:

答案 0 :(得分:4)

快速回答:尝试在“GET”操作方法上使用[ValidateInput(false)]

<强>更新 使用asp.net 4,要使框架确认ValidateInput属性,您还需要在web.config中配置验证模式。

将以下内容设置为<system.web>元素的子元素:

<httpRuntime requestValidationMode="2.0"/>

为什么在“GET”操作方法中有ViewModel?

利用默认的模型绑定器。

例如,我们有Child Actions返回绑定到复杂ViewModels设置的部分视图,我们不希望为每个Child Action显式实例化和重建ViewModel。

例如,Order页面的Edit页面带有一个EditOrderViewModel,它继承BaseUserViewModel,而BaseUserViewModel又包含用户特定的显示数据(用户名,购物车项目数等)。

因此,返回编辑视图的操作方法如下所示:

[ValidateInput(false)]
[HttpGet]
public ViewResult Edit(EditOrderViewModel editOrderVm) 
{ 
    ... 
    return View('Edit', editOrderVm );
}

现在只要请求这个子操作方法以某种方式包含BaseUserViewModel的属性(例如通过Cookies,Form和QueryString属性),那么默认模型绑定器将使用所有基本视图模型实例化和填充EditOrderViewModel数据

但是,当我们第一次加载此页面时,我们不希望验证消息显示在用户尚未有机会编辑的表单中...

因此,我们关闭'GET'请求的模型验证&gt;只需确保验证“POST”请求!

答案 1 :(得分:2)

通常在运行此类操作时,您倾向于使用单个参数而不是完整模型;它看起来正在发生的是模型绑定器正在开始并为您验证您的模型。

您是否可以通过调试ModelState.IsValid为false的操作进行验证,并且其中包含与模型中无效字段相关的某些键?如果是这样,您可以在返回视图之前尝试执行ModelState.Clear(),以防止在这种情况下出现验证错误。

答案 2 :(得分:0)

我遇到了同样的问题,我在模型中使用了CustomValidation属性来创建操作但是对于需要保存对数据库的更改的另一个操作,验证导致了错误。所以我通过删除CustomValidation属性并仅在Create action方法中验证模型来修复它