标签: model-binding

将动态对象与 ASP.NET MVC 模型绑定一起使用

在 ASP.NET MVC3 应用程序中,如果我想将我的表单发布数据模型绑定到一个ExpandoObject(或从DynamicObject我实现自己的Try...成员的位置派生的我自己的对象),我是否需要编写自己的自定义模型绑定器?

如果我做:

public ActionResult Save(ExpandoObject form)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

formIS null

或者如果我有:

public class MyDynamicThing : DynamicObject
{
    public int Id { get; set; }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        // Set breakpoint here but doesn't get hit when model binding
        return base.TrySetMember(binder, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

...在我的控制器中:

public ActionResult Save(MyDynamicThing form)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子Id中设置为来自表单的值。但是,如果我在TrySetMember此设置断点,则不会被击中。

是否有任何神奇的咒语我可以调用来强制内置模型绑定器使用ExpandoObjects或我自己的派生类DynamicObject

我可以诉诸于获取原始表单发布集合,但我必须将此数据序列化为 …

asp.net-mvc model-binding asp.net-mvc-3

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

使用 EntityFramework 和 MVC ModelBinding 保存带有特殊字符的字段时出错

在我的 ASP.NET MVC4 应用程序中保存实体时,我遇到了 (2) 个字段的问题:

  • 电子邮件
  • 电话

如你所知,这些领域将有特殊字符@-典型。这是我使用 ValueInjecter 通过模型绑定从水合对象注入我的模型类的控制器代码:

public ActionResult Create(TestViewModel testViewModel)
{
  using (var context = new MyEntities())
  {
    var person = new Person();
    person.InjectFrom(testViewModel);
    context.Person.AddObject(person);
    context.SaveChanges();
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

“字符串或二进制数据将被截断。语句已终止”

乍一看,您可能会说这是 SQL 中字段的大小,但由于这些特殊字符,真正的问题被伪装了。如果我为字段输入以下内容:

电话:11234565454514564561
电子邮件:blahblahblahblah

...然后一切正常。

但是,如果我输入:

电话:123-456-7890
电子邮件:test@wow.com

我收到有关“字符串或二进制数据将被截断”的错误消息。所以我找到了一个解决方法,但这似乎完全没有必要,而且可能是错误的方式。如果我使用 C# 转义字符将值从模型绑定对象显式映射到实体,那么我的值将插入如下所示:

public ActionResult Create(TestViewModel testViewModel)
{
  using (var context = new MyEntities())
  {
    var person = new Person();
    person.InjectFrom(testViewModel);

    //Explicitly map items preserving special charachters
    person.EmailAddress = @testViewModel.EmailAddress;
    person.Phone …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework model-binding valueinjecter

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

ASP.NET MVC 模型绑定和验证顺序

我有一个模型(简化)如下:

public UserModel {
    ...
    public USState State {get; set; }
    public string StateString {get; set; }
    public Country Country {get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我需要的验证规则是:

  1. 如果Country美国,State需要。
  2. 如果Country不是美国,StateString需要。

我创建了一个自定义验证属性RequiredIfAttribute。这很好用,所以我不打算用它的实现来回答这个问题。它有三个必需的成员:

  1. CompareField - 这是用于检查是否需要验证的字段。
  2. CompareValue - 这是它将用来比较以决定是否需要验证的值。
  3. CompareType - 这就是它如何比较值来决定是否需要验证。

所以有了这个,我更新了我的模型:

public UserModel {
    ...
    [RequiredIf("Country", Country.USA, EqualityType.Equals)]    
    public USState State {get; set; }
    [RequiredIf("Country", Country.USA, EqualityType.NotEquals)] 
    public string StateString {get; set; }
    [Required]                                                   
    public Country Country {get; …
Run Code Online (Sandbox Code Playgroud)

validation asp.net-mvc model-binding model-validation asp.net-mvc-4

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

如何调试 Web API 模型绑定

我现在一直在处理相当多的 Web API 项目,发现自己每次都遇到同样的问题,那就是当我执行 POST 或 GET 值/模型等为空或得到 404 时。

有一个清单,如: - 我是否使用了正确的内容类型?- 路由设置是否正确 - 我发布的模型的签名是否与端点接受的模型完全相同?

如果在失败的地方有一个可以跟踪的踪迹,那就太好了。现在它看起来就像一个黑匣子,你把一些东西放进去,不管它是否有效,如果它没有:请参阅清单或 SO。

是否可以在 Web API 中设置某些内容以便调试模型绑定过程?

model-binding asp.net-web-api

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

如何在 .Net Core 中手动调用模型绑定

有人知道如何轻松地重用 .Net Core 中的内置模型绑定器吗?

我必须定期调用一个返回 NamedValuePaired 数据(如查询字符串)的 api 有没有一种简单的方法来重用模型绑定器而不是解析数据?

我可以只获取数据并再次调用我自己的控制器来进行绑定,但是,除了向我自己的控制器发送 http 帖子之外,还必须有其他方法。

目前我正在做以下事情:

var rawResponse = "";

using (var client = new HttpClient())
{
    //Post to paypal
    var response = await client.PostAsync(_options.TokenUrl, new StringContent(parameters, Encoding.UTF8, "text/namevalue"));
    //read response
    rawResponse = await response.Content.ReadAsStringAsync();
}
var nameValues = QueryHelpers.ParseQuery(rawResponse);

Model m = new Model();

if (nameValues.ContainsKey("RESULT"))
    m.Result = Convert.ToByte(nameValues["RESULT"].FirstOrDefault());

// etc....
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想接收响应并将其传递给内置的模型绑定器,就像它被发布给我一样。

c# model-binding asp.net-core

5
推荐指数
0
解决办法
881
查看次数

如何区分模型绑定错误和模型验证错误?

我正在使用 ASP.NET Core MVC 2.0 实现一个 REST API 项目,如果模型绑定失败(因为请求语法错误),我想返回 400 状态代码,如果模型验证失败,我想返回 422 状态代码(因为该请求在语法上是正确的,但包含不可接受的值)。

例如,给定一个动作,如

[HttpPut("{id}")]
public async Task<IActionResult> UpdateAsync(
    [FromRoute] int id,
    [FromBody] ThingModel model)
Run Code Online (Sandbox Code Playgroud)

id路由中的参数包含非数字字符或请求中未指定正文时,我想返回 400 状态代码,当属性ThingModel包含无效值时返回 422 状态代码。

从我所看到的情况来看,IValueProviderIModelBinder实现都ModelStateDictionary像验证器一样将它们的错误添加到请求中,并且无法在绑定和验证之间注入代码。

我怎样才能实现这样的行为?

c# model-binding model-validation asp.net-core-mvc

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

如何扩展 ComplexTypeModelBinder

我需要为特定类自定义模型绑定,该类Foo涉及使用一些额外的后处理扩展正常绑定逻辑(例如,有条件地将空集合字段设置为空集合)。我想将此逻辑添加到模型绑定,以便结果可用于操作过滤器等​​。

最直接的方法是派生自ComplexTypeModelBinder和覆盖BindModelAsync。然而,不幸的是,该方法不是虚拟的。

组合是下一个选择。我正在尝试创建一个FooModelBinder具有或获取ComplexTypeModelBinder. 但是,我不知道如何注入或解析ComplexTypeModelBinder. 这可能吗?有没有更好的方法来扩展 的功能ComplexTypeModelBinder

c# model-binding asp.net-core-mvc asp.net-core

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

使用 Web API 默认模型绑定器自定义属性名称?

我有一个请求模型类,我正在尝试使用默认的 Web API 2 模型绑定 (.NET 4.6.1)。一些查询字符串参数与模型属性匹配,但有些不匹配。

public async Task<IHttpActionResult> Get([FromUri]MyRequest request) {...}
Run Code Online (Sandbox Code Playgroud)

示例查询字符串:

/api/endpoint?country=GB
Run Code Online (Sandbox Code Playgroud)

示例模型属性:

public class MyRequest
{
    [JsonProperty("country")] // Did not work
    [DataMember(Name = "country")] // Also did not work
    public string CountryCode { get; set; }
    // ... other properties
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在我的模型上使用属性(就像您可能使用的那样[JsonProperty("country")])来避免实现自定义模型绑定?或者最好的方法只是使用为 QueryString 创建一个特定的模型来绑定,然后使用 AutoMapper 来定制差异?

c# model-binding asp.net-web-api2 .net-4.6.1

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

将多选列表发布到对象列表 asp.net core 2

我有两个类,称为UserRole

class User
{
    ...
    public List<Role> Roles;
}

class Role
{
    ...
    public int ID;
    public string Name;
}
Run Code Online (Sandbox Code Playgroud)

我也有一个动作(提交)

public IActionResult Submit(User user)
{
    ...
} 
Run Code Online (Sandbox Code Playgroud)

在我的 Index.cshtmlselect

<select multiple="multiple" class="multi-select" id="my_multi_select1" asp-for="Roles" asp-items="ViewBag.Roles"></select> 
Run Code Online (Sandbox Code Playgroud)

ViewBag.Roles价值是

ViewBag.Roles= new SelectList(Role.SelectAll(), "Name", "Name");
Run Code Online (Sandbox Code Playgroud)

问题是,当我发表我的表单,数据这样的发送 ...&Roles=role1,role2&...user.Roles成为空,而我希望有两个角色与名字role1,并role2和它们分配到user.Roles(实际上,我希望ASP这是否)

c# model-binding multi-select asp.net-core-2.0

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

AspNet Core WebApi 中的自定义模型绑定?

任何人都有使用多态模型绑定的自定义模型绑定的工作示例?我正在尝试使用 web api 项目的这个示例(用于 Mvc 而不是 Api 项目),但它不适用于 API 项目。我认为在填充方面缺少一些步骤,ValueProvider但我找不到与此相关的任何资源(AspNet Core 3.1)。

到目前为止我的尝试:

托斯:

public abstract class Device
{
    public string Kind { get; set; }
}

public class Laptop : Device
{
    public string CPUIndex { get; set; }
}

public class SmartPhone : Device
{
    public string ScreenSize { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

自定义模型绑定器实现:

public class DeviceModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context.Metadata.ModelType != typeof(Device))
        {
            return null;
        }

        var …
Run Code Online (Sandbox Code Playgroud)

c# model-binding custom-model-binder asp.net-core

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