在此处获取错误:
ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage");
如何只允许选择值?即
[ValidateInput(false)]
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage");
ValueProviderResult value2 = bindingContext.ValueProvider.GetValue("ConfirmationMessage2");
}
您有几个选项。
在模型上,将此属性添加到您需要的每个属性中,以允许HTML-最佳选择
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
上面代码中对bindingContext.ValueProvider.GetValue()的调用似乎总是验证数据,而不考虑任何属性。深入研究ASP.NET MVC源代码可以发现,DefaultModelBinder首先检查是否需要请求验证,然后调用bindingContext.UnvalidatedValueProvider.GetValue()方法,该方法带有一个指示是否需要验证的参数。
不幸的是,我们不能使用任何框架代码,因为它是密封的、私有的或其他什么来保护无知的开发人员不做危险的事情,但创建一个尊重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...
}
}
}
另一个必需的部分是检索未验证值的方法。在本例中,我们使用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")
根据@D-W的答案,在我的Edit控制器中,在迭代表单值时,我必须用Request.Unvalidated.Form.AllKeys
替换Request.Params.AllKeys
的所有实例,用Request.Unvalidated.Form[key]
替换Request[key]
的所有实例。
这是唯一对我有效的解决方案。
正如Mike Godin所写,即使设置了[ValidateInput(false)]属性,也必须使用Request.Unvalidate.Form而不是Request。Form这对我使用ASP.NET MVC 5 很有效
以下是在客户端级别编码和在服务器级别解码的步骤:
-
使用jquery提交方法发布表单。
-
在jquery按钮中单击要发布到服务器的事件方法编码字段。示例:
$("#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 () {
$("#btnsearch").click(function () {
$("#search-text").val(encodeURIComponent($("#search-text").val()));
$("#search-form").submit();
});
});