标签: model-binding

模型绑定器不适用于 JSON POST

我通过 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)

c# json http-post model-binding asp.net-core-mvc

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

Web Api 参数绑定:snake_case 到camelCase

我正在一个新的 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)

我是否必须重新发明轮子才能使其正常工作?我见过替换特定类型模型绑定器的例子,但在这个级别上没有。我最好只更改代码中的参数名称吗?

c# model-binding asp.net-web-api

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

C# ASP.NET Core 无法绑定到“Microsoft.AspNetCore.Http.FormCollection”类型的模型

我收到以下错误 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 相关的代码:

C# ASP.NET Core ModelBinder …

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

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

如何在 C# web api 中的查询字符串上绑定 guid 列表?

如何绑定通过查询字符串传递的 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

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

多态绑定器:当自定义模型绑定包装在另一个类中时,验证不起作用

我对本文中的多态绑定示例进行了一些更改。

  1. 为各个类的和属性添加[Required]属性。CPUIndexScreenSizeLaptopSmartPhone
  2. 运行示例并创建任何类型的设备,无需填写 CPU 索引或屏幕尺寸。
  3. 它运行正确 - 模型已绑定并经过验证(向您显示错误,即“需要 CPU 索引/屏幕尺寸”。

到目前为止还可以。

现在添加新类:

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)

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

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

ASP.NET MVC 3 ListBox验证

我正在经历ASP.NET MVC 3 ListBox验证的一个奇怪问题,正如标题中所述.基本上,我在我的viewmodel中有一个List,它绑定到一个启用了多个选择的ListBox.

List被赋予一个属性[Required].当我提交选择了单个值的表单时,它会通过验证而不会出现打嗝.但是,如果不止一个,验证将失败.

有什么想法吗?

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

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

MVC4 - 绑定嵌套集合

我有两节课:

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)

我的项目为空.我究竟做错了什么?有人可以给我一些建议我应该怎么做才能解决这个问题?

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

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

asp.net web api - 清理输入字符串

当前方法是后期操作,构造命令并将其放在总线上.我不喜欢的部分是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 ......但似乎不起作用.

知道如何以非侵入方式解决这个问题吗?

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

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

ASP.NET MVC剃刀视图,从原始模型绑定发布到不同的模型?

我在项目中有一个组控制器和视图,其中模型绑定是GroupViewModel.但是组页面很复杂,用户可以进行讨论主题.在此组视图页面上,我有表单,允许用户发布主题/回复.用于这些表单的模型可以是TopicViewModel或ReplyViewModel,但原始模型绑定仅适用于GroupViewModel.它在cshtml页面的开头声明:

@model MyProject.ViewModels.GroupBrowseViewModel
Run Code Online (Sandbox Code Playgroud)

所以我想知道,是否有可能将表单从顶部声明的表单绑定到不同的视图模型?如果是这样,如何实现这一目标?

c# asp.net-mvc model-binding razor asp.net-mvc-5

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

如何解决传递给mvc控制器的null json字符串?

我使用模型对象列表创建了一个表.然后在单击该行上的按钮时将行数据传递到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)

c# asp.net-mvc json model-binding

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