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.AllKeys
和Request[key]
所有实例replaceRequest.Unvalidated.Form.AllKeys
所有实例Request.Unvalidated.Form[key]
。
这是为我工作的唯一解决scheme。
以下是在客户端进行编码并在服务器级进行解码的步骤:
-
使用jquery提交方法发布表单。
-
在jQuerybutton单击事件方法编码字段,您要发布到服务器。 例:
$("#field").val(encodeURIComponent($("#field").val())) $("#formid").submit();
-
在“控制器级别”访问权限中,全部使用表单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(); }); });