我通过 POST 发送以下 JSON:
POST http://localhost:52873/news
{"text":"testing","isPublic":true}
Run Code Online (Sandbox Code Playgroud)
我的控制器:
public class NewsController : Controller
{
// GET: /<controller>/
[HttpGet]
public IActionResult Index()
{
return View();
}
[HttpPost]
public IActionResult Post(CreatePostCommand command)
{
/* ...more code... */
return new HttpStatusCodeResult(200);
}
}
Run Code Online (Sandbox Code Playgroud)
命令是:
public class CreatePostCommand
{
public string Text { get; set; }
public bool IsPublic { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的路由设置是 VS 2014 CTP 4 中 MVC 模板附带的默认设置:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller …Run Code Online (Sandbox Code Playgroud) 我正在一个新的 web api 项目上做一些工作,我的方法/参数遵循标准的 c# 命名格式;方法名是PascalCase,参数是camelCase。
不幸的是,我刚刚发现客户端的文档已经发布,所有参数都是 ruby/php 样式,带有snake_case 类型的参数名称。
返回对象和 POST 对象易于转换;我使用了crallen 代码的一个版本来替换默认的 Json 输入/输出,但是对于 GET 请求,似乎没有这么简单的答案。
我更愿意保持我的命名约定相同。有没有办法告诉活页夹自动将所有请求的 my_parameter 更改为 myParameter ?我是否必须构建一个完全不同的活页夹?
例如,如果我将此作为方法签名:
[Route("~/api/Widgets")]
[ResponseType(typeof(Widget))]
public async Task<HttpResponseMessage> GetWidget(int widgetId, int groupId)
{
. . .
Run Code Online (Sandbox Code Playgroud)
我希望能够在 URL 中使用它
https://myserver.com/api/Widgets?widget_id=12345&group_id=54321
Run Code Online (Sandbox Code Playgroud)
我是否必须重新发明轮子才能使其正常工作?我见过替换特定类型模型绑定器的例子,但在这个级别上没有。我最好只更改代码中的参数名称吗?
我收到以下错误 An unhandled exception occurred while processing the request. InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ModelBinding.Binders.FormCollectionModelBinder' cannot bind to a model of type 'Microsoft.AspNetCore.Http.FormCollection'. Change the model type to 'Microsoft.AspNetCore.Http.IFormCollection' instead.
这是我使用以下代码的时候:
[ValidateAntiForgeryToken]
[HttpPost]
public IActionResult Index(Test test, FormCollection formCollection)
{
var feesAmountArray = new List<string>();
foreach (var item in formCollection.Keys.Where(k => k.StartsWith("FeesAmount-")))
{
feesAmountArray.Add(formCollection[item].ToString().TrimEnd(','));
}
var feesAmount = string.Join(",", feesAmountArray);
if (ModelState.IsValid)
{
}
return View(test);
}
Run Code Online (Sandbox Code Playgroud)
在模型中,Test我使用了一个[Decimal]与 a 结合使用的属性ModelBinder,但无论如何我都不想绑定到表单,我只想绑定到模型,所以我有点困惑为什么这条消息是呈现自己。
可以在以下位置找到与 ModelBinder 相关的代码:
如何绑定通过查询字符串传递的 Guid 列表以进行 web-api 调用。
我试过逗号分隔的列表、数组等,但他们总是在控制器操作上提供一个空的 guid
公共端点:
public ApiResult Get([FromUri]List<Guid> listIds)
Run Code Online (Sandbox Code Playgroud)
我试过的
endpoint?listIds=78CC5308-5A3D-40C2-8D7C-3AAB0CAC618B,6DA7AFB8-D862-4861-8EA2-EE5EB9BC7C6A
endpoint?listIds=["78CC5308-5A3D-40C2-8D7C-3AAB0CAC618B","6DA7AFB8-D862-4861-8EA2-EE5EB9BC7C6A"]
Run Code Online (Sandbox Code Playgroud)
我每次尝试得到的只是一个包含一个元素的列表,它是空的 GUID
c# model-binding asp.net-web-api asp.net-web-api2 asp.net-core-webapi
我对本文中的多态绑定示例进行了一些更改。
[Required]属性。CPUIndexScreenSizeLaptopSmartPhone到目前为止还可以。
现在添加新类:
public class DeviceWrapper
{
public Device Device { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并修改AddDevice.cshtml.cs文件:
...
[BindProperty]
public DeviceWrapper Device { get; set; } // model type changed here
public IActionResult OnPost()
{
if (!ModelState.IsValid)
{
return Page();
}
switch (Device.Device) // added Device. prefix to respect new model structure
{
case Laptop laptop:
Message = $"You added a Laptop with …Run Code Online (Sandbox Code Playgroud) 我正在经历ASP.NET MVC 3 ListBox验证的一个奇怪问题,正如标题中所述.基本上,我在我的viewmodel中有一个List,它绑定到一个启用了多个选择的ListBox.
List被赋予一个属性[Required].当我提交选择了单个值的表单时,它会通过验证而不会出现打嗝.但是,如果不止一个,验证将失败.
有什么想法吗?
我有两节课:
public class Exercise
{
public Guid Id {get;set;}
public string Name {get;set;}
public List<ExerciseItem> Items {get;set;}
}
public class ExerciseItem
{
public Guid Id {get;set;}
public string Name {get;set;}
public string Content {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我也有创建一个Exercise对象的观点.该视图上有一个名为"添加练习项"的按钮,其中我动态调用ajax方法返回ExerciseItem对象的局部视图.视图正确返回.这个观点如下:
@model Elang.Models.ExerciseItem
<div>
<input type="hidden" name="Items.Index" value="@Model.Id" />
<input type="hidden" id="Items@(Model.Id)__Id" name="Items[@Model.Id].Id" value="@Model.Id" />
<input type="text" id="Items@(Model.Id)__Content" name="Items[@Model.Id].Content" class="inputText"/>
</div>
Run Code Online (Sandbox Code Playgroud)
问题是当我提交表单并调用我的"Create"方法时:
[HttpPost]
public ActionResult Create(Exercise exercise)
{
//add exercise to db
//HOWEVER!!
//exercise.Items is empty
}
Run Code Online (Sandbox Code Playgroud)
我的项目为空.我究竟做错了什么?有人可以给我一些建议我应该怎么做才能解决这个问题?
当前方法是后期操作,构造命令并将其放在总线上.我不喜欢的部分是ModelHelper.Trim,见下文.
[ValidationActionFilter]
public void Post([FromBody]CompanyFormModel company)
{
var newCompany = new NewCompany
{
Id = id,
Name = ModelHelper.Trim(company.Name),
Description = ModelHelper.Trim(company.Description),
Sector = ModelHelper.Trim(company.Sector),
};
_bus.Send(newCompany);
}
Run Code Online (Sandbox Code Playgroud)
该ModelHelper.Trim正在检查该字段为字符串,如果不为空做装饰.有任何方法可以将其作为所有帖子和看跌期权的重要关注点.
试图在Formatters.JsonFormatter.SerializerSettings.Converters中注册一个TrimmingConverter ......但似乎不起作用.
知道如何以非侵入方式解决这个问题吗?
我在项目中有一个组控制器和视图,其中模型绑定是GroupViewModel.但是组页面很复杂,用户可以进行讨论主题.在此组视图页面上,我有表单,允许用户发布主题/回复.用于这些表单的模型可以是TopicViewModel或ReplyViewModel,但原始模型绑定仅适用于GroupViewModel.它在cshtml页面的开头声明:
@model MyProject.ViewModels.GroupBrowseViewModel
Run Code Online (Sandbox Code Playgroud)
所以我想知道,是否有可能将表单从顶部声明的表单绑定到不同的视图模型?如果是这样,如何实现这一目标?
我使用模型对象列表创建了一个表.然后在单击该行上的按钮时将行数据传递到Ajax帖子.
在Ajax Post .stringify中调用传递的行数据.当我检查Dev Tools中传递的数据的值时,我可以看到它们已被填充:
["66", "jdoe@gmail.com", "2009", "test",…]
0
:
"66"
1
:
"jdoe@gmail.com"
2
:
"2009"
3
:
"test"
Run Code Online (Sandbox Code Playgroud)
但是当我进入从客户端调用的控制器POST操作时.预期的JSON字符串为null/empty.我的想法是,这可能是因为stringify没有与数组中的每个值相关联的属性名称.
题:
如何解析传递给mvc控制器的null json字符串?
以下是实施的要点 -
模型:
public class Status
{
[Key]
public int ID { get; set; }
public string Contact_Email { get; set; }
public string RID { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
表和AJAX post方法:
<table id="statusTable" class="table table-hover table-bordered results">
<thead>
<tr>
<th>ID</th>
<th>Email</th>
<th>RID</th>
<th>Name</th>
<th>Update …Run Code Online (Sandbox Code Playgroud) model-binding ×10
c# ×7
asp.net-mvc ×3
asp.net ×2
json ×2
asp.net-core ×1
collections ×1
http-post ×1
listbox ×1
razor ×1
validation ×1