相关疑难解决方法(0)

如何设置TextBox空字符串的默认值而不是null

我可能已经过时了,但我坚持的一个原则是尽可能避免空值.

但是我发现,对于一个强类型视图,用户输入我想要保存的对象的属性,如果没有输入某些字段,则将它们指定为null.

然后,当您尝试保存更改时,验证将失败.

因此,不是将每个属性设置为空字符串,而是如何自动将表单上的每个TextBox设置为默认为空字符串而不是null?

asp.net-mvc null textbox model default-value

26
推荐指数
1
解决办法
2万
查看次数

如何通过自定义属性获取和修改属性值?

我想创建一个可以在以下属性上使用的自定义属性:

[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)

c# asp.net-mvc

16
推荐指数
2
解决办法
2万
查看次数

模型绑定时在视图模型属性上查找自定义属性

我发现了很多关于为验证目的实现自定义模型绑定器的信息,但我还没有看到我正在尝试做什么.

我希望能够根据视图模型中属性的属性来操作模型绑定器要设置的值.例如:

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)

asp.net-mvc custom-attributes model-binding

15
推荐指数
1
解决办法
7287
查看次数

如何在c#MVC中通过Model修剪()所有输入

我发现Model传递的所有值都没有在ASP.net MVC3中修剪

有办法:

  1. 在Model中的每个字段上应用trim()(至少所有字符串字段;但所有表单字段在由Model处理之前都是字符串,因此更好地修剪它们)
  2. 必须在之前ModelState.IsValid()(因为我经常发现代码很奇怪ModelState.IsValid,后来发现因为表单项没有被修剪.)

谢谢.

c# asp.net asp.net-mvc asp.net-mvc-3

10
推荐指数
1
解决办法
1万
查看次数

ASP NET Core修改/替换请求体

我需要替换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(我需要更改请求体的属性值)?

c# .net-core asp.net-core asp.net-core-middleware

10
推荐指数
1
解决办法
6866
查看次数

替换ASP.net MVC核心中的DefaultModelBinder

我正在将MVC 5项目转换为核心.我目前有一个自定义模型绑定器,我用作我的nhibernate实体模型绑定器.我可以通过从数据库中取出实体然后调用基本DefaultModelBinder将请求中的修改数据绑定到实体来获取和绑定.

现在我正在尝试实现IModelBinder ...我可以很好地获取实体.但是当我不再需要调用基本DefaultModelBinder时,如何调用"默认模型绑定器"以绑定其余的表单数据?

提前致谢!

c# nhibernate asp.net-mvc asp.net-core-mvc

8
推荐指数
1
解决办法
1655
查看次数

使用HTML字符串的自定义模型绑定器

我试图将用户输入的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)

c# asp.net-mvc model-binding

7
推荐指数
1
解决办法
3700
查看次数

查看忽略前导和尾随空格的模型验证

我有以下视图模型.

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文档等复制并粘贴到视图中,有时它会占用一个前导和/或尾随空格.由于用户不是最聪明的,并且输入控件中没有显示空格,所以我真的应该忽略它们并继续.

因此,如果我的模型状态无效,我想知道解决此问题的最佳方法 -

  1. 在我的验证表达式中添加空格.
  2. 在操作结果方法中,检查是否修剪电子邮件并手动从模型状态中删除错误.
  3. 做点别的......

我不是100%肯定1,也不是2老实说!

c# asp.net-mvc

6
推荐指数
1
解决办法
2785
查看次数

在哪里 Trim() 传入的请求参数?

我有以下代码块

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)

c# asp.net-mvc trim

5
推荐指数
1
解决办法
1635
查看次数

在实体框架上修剪字符串保存

我在ASP.NET MVC Web应用程序中使用Entity Framework Code First,其中客户习惯在字符串末尾添加空格.

显然Trim()是解决这个问题的正确答案,但是记住在整个项目中修剪一切并不是正确的事情.做了一些挖掘并找到了ASP.NET MVC:在数据输入后修剪字符串的最佳方法.我应该创建自定义模型绑定器吗?他们在哪里创建了一个自定义模型绑定器,但我担心当绑定模型时,应用程序的每个页面加载都会有性能损失.看起来像SaveChanges()被称为修剪将是最有效的方式,因为事情将被存储修剪到数据库中.

所以我的问题是,覆盖SaveChanges()并获取所有添加和修改的对象,ObjectContext然后使用反射来修剪每个字符串,这是正确的事情吗?或者模型绑定器是正确的方法吗?

c# reflection asp.net-mvc entity-framework code-first

4
推荐指数
1
解决办法
1637
查看次数

修剪ASP.NET Web窗体中的所有用户输入字符串

我正在寻找一种方法来修剪ASP.NET中的所有用户输入,而无需在每个字符串实例上调用Trim().我遇到为MVC 扩展DefaultModelBinder.有没有办法在Web表单中执行此操作?有哪些选择?作为一个不太理想的选择,有没有办法将它合并到类的set方法中?

c# asp.net webforms

3
推荐指数
1
解决办法
2633
查看次数