ASP.NET MVC使用自定义模型绑定器时,客户端会检测到有潜在危险的Request.Form值

在这里得到错误:

ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage"); 

我如何只允许select的值? 即

 [ValidateInput(false)] public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage"); ValueProviderResult value2 = bindingContext.ValueProvider.GetValue("ConfirmationMessage2"); } 

你有几个select。

在模型上,将此属性添加到您需要允许HTML的每个属性 – 最佳select

 using System.Web.Mvc; [AllowHtml] public string SomeProperty { get; set; } 

在控制器上添加这个属性来允许所有的HTML

 [ValidateInput(false)] public ActionResult SomeAction(MyViewModel myViewModel) 

在web.config蛮力 – 绝对不推荐

在web.config文件的标签中,插入带有requestValidationMode =“2.0”属性的httpRuntime元素。 还要在pages元素中添加validateRequest =“false”属性。

 <configuration> <system.web> <httpRuntime requestValidationMode="2.0" /> </system.web> <pages validateRequest="false"> </pages> </configuration> 

更多信息: http : //davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx

以上作品默认使用的modelbinder。

自定义ModelBinder

看起来,在上面的代码中调用bindingContext.ValueProvider.GetValue()总是validation数据,而不pipe任何属性。 挖掘ASP.NET MVC源代码揭示了DefaultModelBinder首先检查是否需要请求validation,然后用指示validation是否需要的参数调用bindingContext.UnvalidatedValueProvider.GetValue()方法。

不幸的是,我们不能使用任何框架代码,因为它是封闭的,私有的或者任何保护无知的开发者做危险的东西,但是创build一个尊重AllowHtml和ValidateInput属性的工作定制模型绑定并不难:

 public class MyModelBinder: IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { // First check if request validation is required var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled; // Get value var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation); if (valueProviderResult != null) { var theValue = valueProviderResult.AttemptedValue; // etc... } } } 

另一个需要的部分是一种检索未经validation的值的方法。 在这个例子中,我们使用ModelBindingContext类的扩展方法:

 public static class ExtensionHelpers { public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation) { var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider; return (unvalidatedValueProvider != null) ? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation) : bindingContext.ValueProvider.GetValue(bindingContext.ModelName); } } 

更多信息,请访问http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

尝试:

 HttpRequestBase request = controllerContext.HttpContext.Request; string re = request.Unvalidated.Form.Get("ConfirmationMessage") 

在@DW的回答中,在我的Edit控制器中迭代表单值,我必须用Request.Unvalidated.Form.AllKeysRequest[key]所有实例replaceRequest.Unvalidated.Form.AllKeys所有实例Request.Unvalidated.Form[key]

这是为我工作的唯一解决scheme。

以下是在客户端进行编码并在服务器级进行解码的步骤:

  1. 使用jquery提交方法发布表单。

  2. 在jQuerybutton单击事件方法编码字段,您要发布到服务器。 例:

     $("#field").val(encodeURIComponent($("#field").val())) $("#formid").submit(); 
  3. 在“控制器级别”访问权限中,全部使用表单ID值

     HttpUtility.UrlDecode(Request["fieldid"]) 

示例示例:

  • 控制器级别:

     public ActionResult Name(string id) { CheckDispose(); string start = Request["start-date"]; string end = Request["end-date"]; return View("Index", GetACPViewModel(HttpUtility.UrlDecode(Request["searchid"]), start, end)); } 
  • 客户级别:

     <% using (Html.BeginForm("Name", "App", FormMethod.Post, new { id = "search-form" })) { %> <div> <label for="search-text" style="vertical-align: middle" id="search-label" title="Search for an application by name, the name for who a request was made, or a BEMSID">App, (For Who) Name, or BEMSID: </label> <%= Html.TextBox("searchid", null, new {value=searchText, id = "search-text", placeholder = "Enter Application, Name, or BEMSID" })%> </div> <div> <input id="start-date" name="start-date" class="datepicker" type="text" placeholder="Ex: 1/1/2012"/> </div> <div> <input id="end-date" name="end-date" class="datepicker" type="text" placeholder="Ex: 12/31/2012"/> </div> <div> <input type="button" name="search" id="btnsearch" value="Search" class="searchbtn" style="height:35px"/> </div> <% } %> 

在文档就绪function中:

 $(function () { $("#btnsearch").click(function () { $("#search-text").val(encodeURIComponent($("#search-text").val())); $("#search-form").submit(); }); }); 
Interesting Posts