我正在使用MVC3剃须刀.我有一个场景,我必须在同一父视图上多次使用局部视图.我遇到的问题是,当父视图被渲染时,它会在这些部分视图中生成相同的名称和输入控件的ID.由于我的部分视图被绑定到不同的模型,当视图回发到"保存"时它崩溃了.任何想法我如何使控件ID /名称唯一,可能有些人如何前缀?
等待
纳比勒
我发现在ASP.Net MVC中非常令人沮丧的是,默认模型Required绑定器在将空(字符串或空值)绑定到不可为空的值类型时隐式应用注释,而不是简单地使目标保留其默认值,或者至少提供一个选项,允许它成为默认行为.
鉴于将模型上的目标属性类型更改为可以为空的值不方便的情况,我可以使用的最短代码量是什么,以允许默认模型绑定器简单地跳过将空值绑定到不可空的值的尝试值类型?我假设我需要子类DefaultModelBinder,但我不确定我需要覆盖什么来实现所需的行为.
例:
<input type="text" name="MyField"/>
Run Code Online (Sandbox Code Playgroud)
提交没有价值:
public ActionResult MyAction(MyModel model)
{
// do stuff
}
public class MyModel
{
public int MyField { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
MyField应该允许该属性保留其默认值,0即从表单中发布空值.
假设我不能简单地改变属性类型a Nullable<int>.
我希望我的模型绑定不区分大小写。
我尝试操作从 继承的自定义模型绑定器System.web.Mvc.DefaultModelBinder,但我不知道在哪里添加不区分大小写的内容。
我也看了看IValueProvider,但我不想重新发明轮子并自己找到值。
任何的想法 ?
asp.net-mvc model-binding custom-model-binder value-provider asp.net-mvc-4
我在我的查询字符串中发送一个UTC日期,例如
&结束日期= 2000-01-02T03%3a04%3a05.0060000Z
我的控制器参数将它绑定在一个复杂的对象中,例如
public async Task<DocumentsRequest> GetEchoFromUriDocumentsAsync(
[FromUri] DocumentsRequest request)
{
return request;
}
Run Code Online (Sandbox Code Playgroud)
我设法弄清楚的是参数绑定后我的对象将我的UTC日期更改为本地日期+偏移量.这是我的测试用例的片段
[TestMethod]
public void Should_generate_querystring_and_parameter_bind_correctly()
{
DocumentsRequest request = DocumentRequestBuilder.DocumentsRequest();
string queryString = ReflectionQueryStringConverter.ToQueryString(request);
string baseUrl = "http://baseUrl/Test/EchoFromUriDocuments";
string uri = baseUrl + queryString;
HttpResponseMessage response = _client.GetAsync(uri).Result;
string outputString = response.Content.ReadAsStringAsync().Result;
JsonSerializer<DocumentsRequest> serializer =
new JsonSerializer<DocumentsRequest>();
DocumentsRequest output = serializer.DeserializeFromString(outputString);
output.EndDate.Should().Be(request.EndDate);
}
Run Code Online (Sandbox Code Playgroud)
以上是失败的,因为输出是:
2000-01-01T19:04:05.006-08:00
但是,json序列化然后截断偏移量并假设它是UTC日期...正如您所看到的,日期与往返后的日期不匹配.
这里有一个类似的问题,但不是一个真正的答案(回答的海报是自己的问题)
将UTC DateTime传递给Web API HttpGet方法会产生本地时间
解决此问题的正确解决方案是什么?我认为问题在于我希望参数绑定将查询字符串解析为UTC日期.TypeConverter是走的路吗?任何人都有完整的样本如何做到这一点?我是否必须在DateTime的所有类上的所有属性上使用TypeConverter?我希望有各种各样的全球配置.
谢谢.
I\xc2\xb4m 使用 CalendarDatePicker
\n\n<CalendarDatePicker x:Name="DatePick" DisplayMode="Decade" Date="{Binding DisplayValue, Mode=TwoWay}"/>\nRun Code Online (Sandbox Code Playgroud)\n\n问题是当我绑定日期属性时,选择器不再显示默认占位符文本(选择日期),而是如果属性为 null(属性始终设置为 null),则现在显示 01.01.1916。
\n\npublic DateTimeOffset? DisplayValue {get;set;}\nRun Code Online (Sandbox Code Playgroud)\n\n如果我手动将 null 作为 Date 的值,它现在会再次显示 PlaceholderText。
\n\nDatePick.Date=null;\nRun Code Online (Sandbox Code Playgroud)\n\n并且绑定仍然有效/我在选择日期时得到了所需的值。\n那么是否有可能在不使用隐藏代码的情况下显示占位符文本?
\n我正在编写 ASP.NET Core 1 应用程序,它有一个 Web API 控制器,供应商将在其中发布数据。
这是 Model 类的简化版本,我会将传入数据绑定到该类:
public class Lead
{
public int SupplierId { get; set; }
public DateTime Date { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
问题是日期将以德语格式发布,例如30.09.2016. 我不想将应用程序的全球文化设置为,de-DE因为 a) 我不是德国人,并且 b) 应用程序的其余部分将使用 ISO 日期。
我已经准备好编写一个自定义的IModelBinder,因为它在 ASP.NET Core MVC 中显然是强制性的,一个IModelBinderProvider.
这是我的实现IModelBinderProvider:
public class GermanDateTimeModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (!context.Metadata.IsComplexType &&
context.Metadata.ModelType == typeof(DateTime))
return new …Run Code Online (Sandbox Code Playgroud) c# model-binding custom-model-binder asp.net-core-mvc asp.net-core-webapi
我正在 .NET Core 1.1(完整框架)应用程序中创建 IModelBinder 的自定义实现。
我有一个ActivityModel具有接口属性的类:
public class ActivityModel
{
public int Id { get; set; }
public string Title { get; set; }
public int Type { get; set; }
public IActivityContent Content { get; set; } // marker interface
//more unimportant props
}
Run Code Online (Sandbox Code Playgroud)
这个想法是客户端可以发送带有Content属性的对象,该属性可以是许多(当前为 8 个,但可能会增加)不同类之一。
通过这种方式,我们可以在 API 中拥有一个端点(针对每个 CRUD 操作)来处理所有这些不同类型的对象。
我正在实现一个 ModelBinder 来将从客户端发送的对象变成一个具体的类,这是我到目前为止所得到的:
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var content = bindingContext.ValueProvider.GetValue("content");
return …Run Code Online (Sandbox Code Playgroud) 我在为 ASP.NET Core 2.1 Web API 服务编写自定义模型绑定程序时遇到问题。我有一个如下的操作方法
public async Task<IActionResult> SaveAccountEvents([FromRoute] Guid accountId, IList<AccountEvent> events)
{
}
Run Code Online (Sandbox Code Playgroud)
AccountEvent 类有很多属性,包括
[BindProperty(BinderType = typeof(CustomBinding))]
public string EventBody { get; set; }
Run Code Online (Sandbox Code Playgroud)
目的是我希望来自客户端的此属性的值是字符串或 JObject (JSON)。这个想法是,客户端可以发送字符串化的 JSON 或 EventBody 中的 JSON,模型会将其存储为字符串 - 最终作为字符串化的 JSON。
我遇到的问题是在我的自定义绑定中,bindingContext.ValueProvider.GetValue永远不会返回任何内容。查看该属性,它只包含一个RouteValueProvider. 我看不出有什么方法可以从身体中获取价值。是否有其他方法可以在 ASP.NET Core Web API 中自定义 JSON 反序列化?
更新:
客户端使用此 API 发送事件数据。事件数据由一个信封组成,其中包含事件名称、发送日期、发起事件的用户等内容。在当前版本中,实际事件数据以字符串化 JSON 形式发送。所以现在,请求看起来像这样(注意事件主体是一个字符串):
{
"eventDate": "20180909",
"eventBody": "{
\"newLastName\": \"bob\",
\"primaryApplication\": \"bob\"
}"
}
Run Code Online (Sandbox Code Playgroud)
变化是我希望能够接受 JSON 格式的事件主体。在这种情况下,客户端应该能够发送(请注意,事件正文是正确的 JSON):
{
"eventDate": "20180909",
"eventBody": {
"newLastName": …Run Code Online (Sandbox Code Playgroud) c# model-binding json-deserialization asp.net-core asp.net-core-webapi
我一直在尝试弄清楚如何将自定义模型绑定与 .net Core 2 Web api 结合使用,但未能使其正常工作。
我已经阅读了一些文章,如下 http://www.palmmedia.de/Blog/2018/5/13/aspnet-core-model-binding-of-abstract-classes Asp net core rc2。抽象类模型绑定
就我而言,bindingContext.ModelName始终为空。有人能解释为什么会这样吗?
下面的示例实现
控制器
public IActionResult SomeAction([ModelBinder(BinderType = typeof(BlahTypeModelBinder))][FromBody]TheBaseClass theBase)
{
return Ok();
}
Run Code Online (Sandbox Code Playgroud)
楷模
public abstract class TheBaseClass
{
public abstract int WhatType { get; }
}
public class A : TheBaseClass
{
public override int WhatType { get { return 1; } }
}
public class B : TheBaseClass
{
public override int WhatType { get { return 2; } }
}
Run Code Online (Sandbox Code Playgroud)
提供者
public …Run Code Online (Sandbox Code Playgroud) 我试图让枚举以大肆展示和响应时的描述(或任何其他属性)中的友好名称。还尝试解析控制器操作中主体/查询字符串上设置的友好名称,而不尝试 400 BadRequest 或任何类型的验证错误。我还注意到,我拥有的自定义通用 JsonConverter 也无法正常工作。该ReadJson()方法根本没有被调用。我怎样才能让它发挥作用?
[JsonConverter(typeof(JsonEnumConverter<SortDirectionType>))]
public enum SortDirectionType
{
[Description("asc")]
ASCENDING,
[Description("desc")]
DESCENDING
}
Run Code Online (Sandbox Code Playgroud)
我试图让 swagger-ui 将 asc 和 desc 显示为下拉列表中的值,而不是升序和降序。这意味着我无法使用c.DescribeAllEnumsAsStrings(). 如果我不使用它,那么下拉列表将显示 0,1,因为它应该代表枚举成员值。现在我可以使用[EnumMember(Value="asc"]属性而不是[Description("asc")]属性。然而接下来发生了两件事:
[FromBody]参数中成功使用 0,1 或 ASCENDING、DESCENDING 值。然而,这并不是我们所期望的。我将接收 asc、desc 并希望能够在主体模型上成功解析它并将其映射到枚举属性。另一方面,当 json 呈现时,它应该呈现友好的名称。附加代码:
public class JsonEnumConverter<T> : JsonConverter where T : struct, IComparable, IConvertible, IFormattable
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}
public override object ReadJson(JsonReader …Run Code Online (Sandbox Code Playgroud) model-binding ×10
c# ×7
asp.net-core ×3
asp.net-mvc ×3
asp.net ×1
datetime ×1
enums ×1
utc ×1
uwp ×1
xaml ×1