标签: model-binding

将路由和正文中的多个参数绑定到 ASP.NET Core 中的模型

我在路由中提供了一个 ID(“.../api/mobile/registers/192” - 192 是 ID),并在 PUT 请求正文中提供了其余参数。如何将它们绑定到具有所有参数的模型?问题是ID没有映射,它总是0:

\n
[HttpPut("registers/{id}")]\npublic async Task ModifyPaymentRegister(PaymentRegisterModifyRequestVm model)\n{\n    var result = await financeService.ModifyPaymentRegisterAsync(model, CurrentUserId.Value);\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    [BindProperties(SupportsGet = true)]\n    public class PaymentRegisterModifyRequestVm\n    {\n        /// <summary>\n        /// \xd0\x98\xd0\xb4\xd0\xb5\xd0\xbd\xd1\x82\xd0\xb8\xd1\x84\xd0\xb8\xd0\xba\xd0\xb0\xd1\x82\xd0\xbe\xd1\x80 \xd1\x80\xd0\xb5\xd0\xb5\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\n        /// </summary>\n        [FromRoute]\n        public int Id { get; set; }\n\n        /// <summary>\n        /// \xd0\x9e\xd0\xbf\xd0\xb8\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x80\xd0\xb5\xd0\xb5\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\n        /// </summary>\n        [FromBody]\n        public string Description { get; set; }\n\n        /// <summary>\n        /// \xd0\xa2\xd0\xb8\xd0\xbf \xd0\xbc\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x84\xd0\xb8\xd0\xba\xd0\xb0\xd1\x86\xd0\xb8\xd0\xb8 \xd1\x80\xd0\xb5\xd0\xb5\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\n        /// </summary>\n        [FromBody]\n        public PaymentModifyType ModifyType { get; set; }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

c# model-binding asp.net-core

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

如何禁用特定 ASP.NET Core 5.0 Web API 操作的自动模型绑定?

我有一个第三方专有应用程序,我需要在 ASP.NET Core 5.0 Web API 应用程序中为其编写一个 API 端点。

第三方应用程序发出 HTTP post 请求,请求正文中仅包含二进制数据,以及内容类型application/x-www-form-urlencoded,或者有时application/octet-stream(有点随机,但数据相同)。

我的动作处理程序如下所示:

[Route("~/Validation")]
[ApiController]
public class ValidationController : ControllerBase
{
    [HttpPost("{requestId}")]
    [Consumes(@"application/octet-stream", @"application/x-www-form-urlencoded")]
    [Produces(@"application/octet-stream")]
    public async Task<IActionResult> Validation_Post([FromRoute] string requestId)
    {
        byte[] rawRequestBody = Array.Empty<byte>();
        {
            long streamInitialPos = 0;
            if (Request.Body.CanSeek) // rewind for this read.
            {
                streamInitialPos = Request.Body.Position;
                Request.Body.Seek(0, SeekOrigin.Begin);
            }
            using (var ms = new MemoryStream())
            {
                await Request.Body.CopyToAsync(ms);
                rawRequestBody = ms.ToArray() ?? throw new NullReferenceException();
            }
            if (Request.Body.CanSeek) // …
Run Code Online (Sandbox Code Playgroud)

c# model-binding asp.net-core asp.net-core-webapi asp.net-core-5.0

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

ASP.NET MVC 3模型绑定 - 与输入id ="Title"的ViewBag.Title冲突

ViewBag动态属性似乎存在问题.让我们说:

@{
    ViewBag.Title = @Model.CourseName;
}
Run Code Online (Sandbox Code Playgroud)

然后在页面上我有一个表格:

@Html.TextBox("Title", null, new {style="width:400px;"})
Run Code Online (Sandbox Code Playgroud)

其中Title是数据库表中字段的名称.

首次打开页面时,ID为"Title"的文本框将获取ViewBag.Title动态属性的值.

我对模型绑定的确切细节有点模糊,但这似乎是一个错误,或者如果没有,如果它是由于绑定过程而自然发生的事情,那么警告它会很好这个.

我找到的工作是将ViewBag属性重命名为:

@{
    ViewBag.Titulo = @Model.CourseName;
}
Run Code Online (Sandbox Code Playgroud)

(标题改为Titulo - 总是很高兴知道另一种语言以避免姓名冲突......)

问题消失了.

但问题是:

这种行为是期待的吗?这个漏洞很容易找到(花了一个小时来弄清楚,包括写这个问题),但我怀疑其他漏洞可能更多,嗯,晦涩难懂.

编辑:

解释这个问题:

Model Binder是否自动绑定它在ViewBag中找到的属性?即使强类型ViewModel中存在现有属性,我已经传递到页面?当然ViewModel应该优先考虑吗?

model-binding name-clash viewbag asp.net-mvc-3

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

在MVC 3中,如何使默认模型绑定器将空字符串视为"空"而不是"空"?

我正在使用实体框架代码优先与POCO进行数据库交互.我有一个可选的字段叫做"标题".

当我从表单中获取对象时,默认模型绑定器会自动使"标题"为null而不是空.

如何让模型绑定器返回空字符串而不是null?

谢谢你的帮助

asp.net-mvc poco model-binding

5
推荐指数
2
解决办法
1390
查看次数

MVC 3传递实体作为接口

我目前正在使用Ninject作为我的DI工作的MVC 3项目,业务对象存储在一个单独的程序集中.我遇到了控制器参数的问题,当回发CRUD操作时,我收到错误"无法创建接口的实例".我知道你不能创建一个接口的实例,但似乎我可以解决的唯一方法是使用自定义模型绑定器并通过FormCollection.这看起来非常混乱,我想尽可能多地保留项目中特定类型的代码 - 因此在任何地方接口和Ninject到DI的混凝土.自定义模型绑定不仅看起来很乱 - 我不会丢失我的DataAnnotations吗?

一些代码来描述我的内容:

public ActionResult Create()
{
    // I'm thinking of using a factory pattern for this part
    var objectToCreate = new ConcereteType();
    return (objectToEdit);
}

[HttpPost]
public ActionResult Create(IRecord record)
{
    // check model and pass to repository
    if (ModelState.IsValue)
    {
        _repository.Create(record);
        return View();
    }

    return View(record);
}
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个?你是怎么克服它的?

谢谢!

dependency-injection interface model-binding loose-coupling asp.net-mvc-3

5
推荐指数
2
解决办法
4726
查看次数

有没有理由为什么默认的模型绑定器不绑定到字段?

我正在使用ASP.NET MVC3,我想知道默认的模型绑定器绑定到公共属性,但不绑定到公共字段.

通常我只是用属性定义模型类,但有时我使用一些包含一些字段的预定义类.每次我必须调试并记住模型绑定器只是不喜欢字段.

问题:背后的原因是什么?

defaultmodelbinder model-binding asp.net-mvc-3

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

Steve Sanderson的BeginCollectionItem助手无法正确绑定

我正在使用Steve Sanderson的BeginCollectionItem助手并遇到了问题.我有一个表单,可以选择添加无限的奖励字段.我正在使用他的助手,因为它解决了这个问题,如何继续生成字段,而不必担心在提交表单时如何绑定它.

我在这个相同的形式有一些复选框,有一个未知的数量.这个与奖励的区别在于数据库调用后将知道未知数量,并且在代码到达视图时将会知道.

所以我的代码看起来像这样

  public class FrmVm
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public bool Active { get; set; }

        public IList<WarrantyFeaturesVm> WarrantyFeaturesVm { get; set; } // this is the checkbox ones.
         public IList<RewardVms> RewardVms { get; set; } // this is the dyanmic one that I needed the helper for

        public CbCreditCardFrmVm()
        {
            Active = true;
            WarrantyFeaturesVm = new List<WarrantyFeaturesVm>();
             RewardVms = new List<RewardVms>();
        }
    }


    // view

    @foreach …
Run Code Online (Sandbox Code Playgroud)

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

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

Asp.Net MVC 3自定义模型与变量对象的绑定

我的实体:( PersonModel应该有一个AddressOne或AddressTwo类型的地址(可能还有其他),所以PersonModel有一个地址字段的对象类型.)

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public object Address { get; set; }
}

public class AddressOne
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class AddressTwo
{
    public string Province { get; set; }
    public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

模型:(我在typeOfAddress中传递一个隐藏字段,以匹配表单提交后的正确地址)

public class PersonModel
{
    private System.Type …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc model-binding

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

ASP.NET MVC:控制器如何在URL中的参数之间进行distingush并通过POST发送

我想更好地理解控制器方法如何知道何时应该从post数据或url中恢复它所回收的参数.

请看以下示例:

URL: /ModelController/Method/itemID 
// Where itemID is the id (int) of the item in the database
POST: objectOrArray: {JSON Object/Array}
Run Code Online (Sandbox Code Playgroud)

控制器看起来像这样:

[HttpPost]
public ActionResult InputResources(int? id, Object objectOrArray)
Run Code Online (Sandbox Code Playgroud)

现在,不知何故,该方法足够智能,可以id在站点URL中查找第一个参数,ObjectHTTPPost.

虽然这有效,但我不知道为什么,因此我有时会遇到不可预测和不稳定的行为.例如,我似乎已经发现(虽然我不是100%肯定)删除?from int? id会使控制器方法立即假设它应该HTTPPost在URL而不是URL中查找id .

所以我想澄清以下几点:

究竟是什么告诉方法在哪里查找数据?([HttpPost]预先确定方法的属性?)

命名约定是否起作用?(例如,删除?或不使用id变量名?)

变量的排序顺序是否有影响?(即放在Object之前id)

我知道我可以通过反复试验来或多或少地弄清楚这些东西,但我想要一个合格的解释而不是继续基于观察的假设工作.

谢谢

Chopo

c# asp.net-mvc model-binding

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

如何在web api中创建一个int []参数?

我在我的api上有一堆操作,它们是通用的GetById和GetByIds,它们将实体拉出并通过格式化程序返回.

这些操作如下所示:

[HttpGet]
[Route("ByIds")]
public IHttpActionResult ByIds([FromUri]int[] ids)
{
    var items = _myContext.SomeEntity.Where(a => ids.Contains(a.ID)).ToList();
    return SomeFormatter(items);
}
Run Code Online (Sandbox Code Playgroud)

http://localhost/api/SomeEntity/ByIds?ids=1&ids=2例如,如果你点击这个,就会得到一个1和2的数组,正如你所期望的那样.

如果你点击它http://localhost/api/SomeEntity/ByIds?ids=可能会得到一个空数组,但你得到int[1]一个值0.

我怀疑发生了什么是它将其识别为指定的一个元素,无法转换它,因此使用default(int)并将其放入数组中,这会为您提供一个具有一个值的int数组,值为0.

但是,如果你点击它http://localhost/api/SomeEntity/ByIds?ids=potato然后你得到一个无效的模型状态,我自动处理它.

问题是,将空查询参数值映射到空数组或ModelState错误(即,如果提供空值,则与马铃薯行为相同)的方法是什么?我认为模型状态错误是首选,更合乎逻辑.

asp.net-mvc model-binding asp.net-web-api

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