我在路由中提供了一个 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}\nRun 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 }\nRun Code Online (Sandbox Code Playgroud)\n 我有一个第三方专有应用程序,我需要在 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
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应该优先考虑吗?
我正在使用实体框架代码优先与POCO进行数据库交互.我有一个可选的字段叫做"标题".
当我从表单中获取对象时,默认模型绑定器会自动使"标题"为null而不是空.
如何让模型绑定器返回空字符串而不是null?
谢谢你的帮助
我目前正在使用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
我正在使用ASP.NET MVC3,我想知道默认的模型绑定器绑定到公共属性,但不绑定到公共字段.
通常我只是用属性定义模型类,但有时我使用一些包含一些字段的预定义类.每次我必须调试并记住模型绑定器只是不喜欢字段.
问题:背后的原因是什么?
我正在使用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) 我的实体:( 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) 我想更好地理解控制器方法如何知道何时应该从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中查找第一个参数,Object即HTTPPost.
虽然这有效,但我不知道为什么,因此我有时会遇到不可预测和不稳定的行为.例如,我似乎已经发现(虽然我不是100%肯定)删除?from int? id会使控制器方法立即假设它应该HTTPPost在URL而不是URL中查找id .
所以我想澄清以下几点:
究竟是什么告诉方法在哪里查找数据?([HttpPost]预先确定方法的属性?)
命名约定是否起作用?(例如,删除?或不使用id变量名?)
变量的排序顺序是否有影响?(即放在Object之前id)
我知道我可以通过反复试验来或多或少地弄清楚这些东西,但我想要一个合格的解释而不是继续基于观察的假设工作.
谢谢
Chopo
我在我的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错误(即,如果提供空值,则与马铃薯行为相同)的方法是什么?我认为模型状态错误是首选,更合乎逻辑.
model-binding ×10
asp.net-mvc ×5
c# ×4
asp.net-core ×2
html-helper ×1
interface ×1
name-clash ×1
poco ×1
viewbag ×1