我可能已经过时了,但我坚持的一个原则是尽可能避免空值.
但是我发现,对于一个强类型视图,用户输入我想要保存的对象的属性,如果没有输入某些字段,则将它们指定为null.
然后,当您尝试保存更改时,验证将失败.
因此,不是将每个属性设置为空字符串,而是如何自动将表单上的每个TextBox设置为默认为空字符串而不是null?
我想创建一个可以在以下属性上使用的自定义属性:
[TrimInputString]
public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud)
这将是功能相当于
private string _firstName
public string FirstName {
set {
_firstName = value.Trim();
}
get {
return _firstName;
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上每次设置属性时都会修剪该值.
如何获取解析的值,修改该值,然后使用属性中的新值全部设置属性?
[AttributeUsage(AttributeTargets.Property)]
public class TrimInputAttribute : Attribute {
public TrimInputAttribute() {
//not sure how to get and modify the property here
}
}
Run Code Online (Sandbox Code Playgroud) 我发现了很多关于为验证目的实现自定义模型绑定器的信息,但我还没有看到我正在尝试做什么.
我希望能够根据视图模型中属性的属性来操作模型绑定器要设置的值.例如:
public class FooViewModel : ViewModel
{
[AddBar]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
AddBar就是
public class AddBarAttribute : System.Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
我无法在自定义模型绑定器的BindModel方法中找到一种在查看模型属性上查找属性的简洁方法.这有效,但感觉应该有一个更简单的解决方案:
public class FooBarModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = base.BindModel(controllerContext, bindingContext);
var hasBarAttribute = false;
if(bindingContext.ModelMetadata.ContainerType != null)
{
var property = bindingContext.ModelMetadata.ContainerType.GetProperties()
.Where(x => x.Name == bindingContext.ModelMetadata.PropertyName).FirstOrDefault();
hasBarAttribute = property != null && property.GetCustomAttributes(true).Where(x => x.GetType() == typeof(AddBarAttribute)).Count() > 0;
}
if(value.GetType() == typeof(String) && …Run Code Online (Sandbox Code Playgroud) 我发现Model传递的所有值都没有在ASP.net MVC3中修剪
有办法:
ModelState.IsValid()(因为我经常发现代码很奇怪ModelState.IsValid,后来发现因为表单项没有被修剪.)谢谢.
我需要替换HttpContext.Request.Body.
我试过在中间件中做这件事
public async Task Invoke(HttpContext context)
{
if (context.Request.Path.Value.Contains("DataSourceResult"))
{
var originalBody = new StreamReader(context.Request.Body).ReadToEnd();
DataSourceRequest dataSource = null;
try
{
dataSource = JsonConvert.DeserializeObject<DataSourceRequest>(originalBody);
} catch
{
await _next.Invoke(context);
}
if (dataSource != null && dataSource.Take > 2000)
{
dataSource.Take = 2000;
var bytesToWrite = dataSource.AsByteArray();
await context.Request.Body.WriteAsync(bytesToWrite, 0, bytesToWrite.Length);
}
else
{
var bytesToWrite = originalBody.AsByteArray();
await context.Request.Body.WriteAsync(bytesToWrite, 0, bytesToWrite.Length);
}
}
await _next.Invoke(context);
}
Run Code Online (Sandbox Code Playgroud)
第一个问题是主体只能读取一次,第二个问题是流是只读的,不能写入.如何修改/替换request.body(我需要更改请求体的属性值)?
我正在将MVC 5项目转换为核心.我目前有一个自定义模型绑定器,我用作我的nhibernate实体模型绑定器.我可以通过从数据库中取出实体然后调用基本DefaultModelBinder将请求中的修改数据绑定到实体来获取和绑定.
现在我正在尝试实现IModelBinder ...我可以很好地获取实体.但是当我不再需要调用基本DefaultModelBinder时,如何调用"默认模型绑定器"以绑定其余的表单数据?
提前致谢!
我试图将用户输入的HTML字符串从POST绑定到模型对象上的简单字符串变量.如果我使用该[AllowHtml]属性,这工作正常.但是,我想在进入模型之前清理HTML,因此我创建了一个ModelBinder:
public class SafeHtmlModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerCtx, ModelBindingContext bindingCtx)
{
var bound = base.BindModel(controllerCtx, bindingCtx);
// TODO - return a safe HTML fragment string
return bound;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个CustomModelBinderAttribute:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class SafeHtmlModelBinderAttribute : CustomModelBinderAttribute
{
public SafeHtmlModelBinderAttribute()
{
binder = new SafeHtmlModelBinder();
}
private IModelBinder binder;
public override IModelBinder GetBinder()
{
return binder;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我使用new属性注释我想要清理的模型属性:
[Required(AllowEmptyStrings = false, ErrorMessage = "You must fill …Run Code Online (Sandbox Code Playgroud) 我有以下视图模型.
public UserViewModel {
...
[Email(@"^.+@[^\.].*\.[a-z]{2,}$", false, ErrorMessage="...")]
public string EmailAddress{ get; set; }
...
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Visitor(UserViewModel userViewModel)
...
Run Code Online (Sandbox Code Playgroud)
但是我发现有时用户会将电子邮件从另一封电子邮件,Word文档等复制并粘贴到视图中,有时它会占用一个前导和/或尾随空格.由于用户不是最聪明的,并且输入控件中没有显示空格,所以我真的应该忽略它们并继续.
因此,如果我的模型状态无效,我想知道解决此问题的最佳方法 -
我不是100%肯定1,也不是2老实说!
我有以下代码块
public ActionResult Tabs(SearchViewModel svm)
{
if (Request.IsAjaxRequest())
{
svm.Summary = _entitySearchService.GetSearchDataSummary(svm.Search);
return PartialView(svm);
}
else
{
return RedirectToAction("QuickSearch", "Search"
, new RouteValueDictionary { { "search", svm.Search } });
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户提交以空格结尾的搜索,例如“something”,如果它是 ajax 请求,那么它工作正常,但如果它不是 ajax 请求,请求将被重定向到不同的操作方法,此时会出现问题并返回 404。
我可以trim()在else子句中做一个,例如
new RouteValueDictionary { { "search", svm.Search.Trim() } }
但有一些地方会发生这种情况。理想情况下,我可以在一个地方完成这一切。
如果我把它放到Controller的Initialize方法中会不会被认为太hackish了?
protected override void Initialize(RequestContext requestContext)
{
// do a test to see if there's a 'search' parameter in requestContext,
// and if so, trim it
base.Initialize(requestContext); …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET MVC Web应用程序中使用Entity Framework Code First,其中客户习惯在字符串末尾添加空格.
显然Trim()是解决这个问题的正确答案,但是记住在整个项目中修剪一切并不是正确的事情.做了一些挖掘并找到了ASP.NET MVC:在数据输入后修剪字符串的最佳方法.我应该创建自定义模型绑定器吗?他们在哪里创建了一个自定义模型绑定器,但我担心当绑定模型时,应用程序的每个页面加载都会有性能损失.看起来像SaveChanges()被称为修剪将是最有效的方式,因为事情将被存储修剪到数据库中.
所以我的问题是,覆盖SaveChanges()并获取所有添加和修改的对象,ObjectContext然后使用反射来修剪每个字符串,这是正确的事情吗?或者模型绑定器是正确的方法吗?
我正在寻找一种方法来修剪ASP.NET中的所有用户输入,而无需在每个字符串实例上调用Trim().我遇到了为MVC 扩展DefaultModelBinder.有没有办法在Web表单中执行此操作?有哪些选择?作为一个不太理想的选择,有没有办法将它合并到类的set方法中?
asp.net-mvc ×9
c# ×9
asp.net ×2
.net-core ×1
asp.net-core ×1
code-first ×1
model ×1
nhibernate ×1
null ×1
reflection ×1
textbox ×1
trim ×1
webforms ×1