我有一个Enum Flags网格,其中每个记录都是一行复选框,用于确定记录的标志值.这是系统提供的通知列表,用户可以选择(每个)他们希望如何传递的通知:
[Flag]
public enum NotificationDeliveryType
{
InSystem = 1,
Email = 2,
Text = 4
}
Run Code Online (Sandbox Code Playgroud)
我找到了这篇文章,但他正在取回一个标志值,并且他将它绑定在控制器中,就像这样(一周中的几天概念):
[HttpPost]
public ActionResult MyPostedPage(MyModel model)
{
//I moved the logic for setting this into a helper
//because this could be re-used elsewhere.
model.WeekDays = Enum<DayOfWeek>.ParseToEnumFlag(Request.Form, "WeekDays[]");
...
}
Run Code Online (Sandbox Code Playgroud)
我无法找到MVC 3模型绑定器可以处理标志的任何地方.谢谢!
这是我的模型,它是一个WCF代理类
public class MyModel
{
public Employees[] MyEmpls{get;set;}
public int Id{get;set;}
public OrgName{get;set;}
}
Run Code Online (Sandbox Code Playgroud)
将下面的json结构对象传递MyEmpls as empty array
给MVC控制器.
["Id":12, "MyEmpls":[], "OrgName":"Kekran Mcran"]
Run Code Online (Sandbox Code Playgroud)
调节器
[HttpPost]
public ActionResult SaveOrg(MyModel model)
{
//model.MyEmpls is null here
}
Run Code Online (Sandbox Code Playgroud)
我期待mode.MyEmpls
作为空c#数组而不是null.有人可以帮我吗?我们需要为此编写自定义模型绑定器吗?
从 ASP.NET API 中的 .NET 6 开始,如果要获取DateOnly
(或TimeOnly
) 作为查询参数,则需要单独指定其所有字段,而不是仅提供字符串(“2021-09-14”或“10: 54:53" 为TimeOnly
) 就像你可以为 一样DateTime
。
如果它们是正文的一部分,我可以通过添加自定义 JSON 转换器 ( AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(...))
) 来解决这个问题,但它不适用于查询参数。
我知道这可以通过模型绑定器修复,但我不想为每个包含DateOnly/TimeOnly
. 有没有办法广泛修复这个应用程序?
演示:
假设您有以下操作:
[HttpGet] public void Foo([FromQuery] DateOnly date, [FromQuery] TimeOnly time, [FromQuery] DateTime dateTime)
下面是它在 Swagger 中的表示方式:
我希望它表示为三个字符串字段:一个 for DateOnly
、一个 forTimeOnly
和一个 for DateTime
(这个已经存在)。
PS:这不是 Swagger 问题,而是 ASP.NET 问题。如果我尝试?date=2021-09-14
手动传递,ASP.NET 将无法理解它。
我有以下控制器操作:
[HttpPost]
public ViewResult DoSomething(MyModel model)
{
// do something
return View();
}
Run Code Online (Sandbox Code Playgroud)
哪里MyModel
是这样的:
public class MyModel
{
public string PropertyA {get; set;}
public IList<int> PropertyB {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
所以DefaultModelBinder应该没有问题地绑定它.唯一的事情是我想使用特殊/自定义绑定器进行绑定PropertyB
,我也想重用这个绑定器.所以我认为解决方案是在PropertyB之前放置一个ModelBinder属性,当然这不起作用(属性上不允许使用ModelBinder属性).我看到两个解决方案:
要在每个属性上使用动作参数而不是整个模型(我不喜欢,因为模型具有很多属性),如下所示:
public ViewResult DoSomething(string propertyA, [ModelBinder(typeof(MyModelBinder))] propertyB)
Run Code Online (Sandbox Code Playgroud)要创建一个新类型,可以说MyCustomType: List<int>
并注册此类型的模型绑定器(这是一个选项)
也许为MyModel创建一个绑定器,覆盖BindProperty
以及该属性是否"PropertyB"
使用我的自定义绑定器绑定该属性.这可能吗?
还有其他解决方案吗?
我正在关注[ASP.NET MVC 3入门] [1].我无法使用Price = 9.99或9,99的值添加/编辑.它说:"价值'9.99'对价格无效." 和"现场价格必须是一个数字."
如何解决这个问题?
模型:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
public class MovieDbContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public class MovieController : Controller
{
private MovieDbContext db = new MovieDbContext();
//
// GET: /Movie/ …
Run Code Online (Sandbox Code Playgroud) [我自己解决了这个问题,看看我的答案]
我在控制器方法集中正确获取IList <>参数的表单值时遇到问题.
我的控制器类看起来像这样:
public class ShoppingBasketController : Controller {
public ActionResult Index() {
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(IList<ShoppingBasketItem> items) {
Session["basket"] = items; // for testing
return RedirectToAction("Index");
}
}
public class ShoppingBasketItem {
public int ItemID;
public int ItemQuantity;
}
Run Code Online (Sandbox Code Playgroud)
略微修剪的形式:
<% using (Html.BeginForm("Add", "ShoppingBasket")) { %>
<% int codeIndex = 0;
foreach (Product product in products) { %>
<%= Html.Hidden("items[" + codeIndex + "].ItemID", product.Id) %>
<%= Html.TextBox("items[" + codeIndex + "].ItemQuantity", "0", new { …
Run Code Online (Sandbox Code Playgroud) 如何绑定逗号分隔值的查询字符串参数
http://localhost/Action?ids=4783,5063,5305
Run Code Online (Sandbox Code Playgroud)
一个控制器动作期待一个列表?
public ActionResult Action(List<long> ids)
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
注意! ids
在控制器动作中必须有一个列表(或基于IEnumerable的东西),所以string ids
不被接受作为答案,因为这些参数被传递给许多动作并且将字符串解析为数组会增加不需要的噪声.
我的印象是,ASP.Net Web API中的模型绑定应该支持具有MVC支持的相同最低功能级别的绑定.
拿以下控制器:
public class WordsController : ApiController
{
private string[] _words = new [] { "apple", "ball", "cat", "dog" };
public IEnumerable<string> Get(SearchModel searchSearchModel)
{
return _words
.Where(w => w.Contains(searchSearchModel.Search))
.Take(searchSearchModel.Max);
}
}
public class SearchModel
{
public string Search { get; set; }
public int Max { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我要求它:
http://localhost:62855/api/words?search=a&max=2
Run Code Online (Sandbox Code Playgroud)
不幸的是,模型没有像在MVC中那样绑定.为什么这不像我期望的那样具有约束力?我的应用程序中会有很多不同的模型类型.如果绑定工作就好了,就像在MVC中一样.
model-binding custom-model-binder asp.net-web-api jquery-datatables-editor
App_GlobalResources
使用PropertyValueRequired
密钥添加资源文件并更改DefaultModelBinder.ResourceClassKey
为文件名对MVC 4没有影响.字符串The {0} field is required
永远不会更改.我不想在每个必填字段上设置资源类类型和键.我错过了什么吗?
编辑:
我对Darin Dimitrov的代码进行了一些小修改,以保持必需的自定义工作:
public class MyRequiredAttributeAdapter : RequiredAttributeAdapter
{
public MyRequiredAttributeAdapter(
ModelMetadata metadata,
ControllerContext context,
RequiredAttribute attribute
)
: base(metadata, context, attribute)
{
if (attribute.ErrorMessageResourceType == null)
{
attribute.ErrorMessageResourceType = typeof(Messages);
}
if (attribute.ErrorMessageResourceName == null)
{
attribute.ErrorMessageResourceName = "PropertyValueRequired";
}
}
}
Run Code Online (Sandbox Code Playgroud) 在WebApi中,我可以在控制器动作上装饰一个参数,[FromUri]
以便将URI的组件'反序列化'(如果愿意的话)放入POCO模型中; 又称模型绑定.
尽管从2.0开始使用MVC,我从未将它用于网站(不知道为什么).它与ASP.NET MVC 5中的相同之处是什么?
除非我需要引用库,否则IDE中似乎无法识别该属性.
我想~/thing/2014/9
绑定到下面的模型:
public class WhateverModel
{
public int Year { get; set; }
public int Month { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
谢谢
更新
在另一个问题(上面的链接)中,OP说:
但是,将其切换为普通MVC而不是WebApi,并且默认模型绑定器会崩溃,并且无法绑定嵌套数组中对象的属性
这意味着他正在使用WebApi中的属性.我猜.我没有这些引用,因为我在MVC中,所以(ab)使用WebApi的版本是否可以在MVC中执行此操作?
更新2
在这个问题的答案是:
您需要构建关于MVC模型绑定器命名约定的查询字符串.
此外
[FromUri]
,示例操作中的属性完全被忽略,因为MVC DefaultModelBinder不知道它
因此,如果他在错误的属性上取得了一些成功,那么我仍然不知道OP在该问题上该做什么或在地球上做什么.
我想我希望得到一个明确的答案,而不是那个问题的泥泞.
model-binding ×10
asp.net-mvc ×7
c# ×5
.net-6.0 ×1
asp.net ×1
decimal ×1
enum-flags ×1
json ×1
localization ×1
razor ×1
wcf ×1