我需要实现一种功能,允许用户以任何形式输入价格,即允许10美元,10美元,10美元......作为输入.
我想通过为Price类实现自定义模型绑定器来解决这个问题.
class Price { decimal Value; int ID; }
Run Code Online (Sandbox Code Playgroud)
表单包含一个数组或价格作为键
keys:
"Prices[0].Value"
"Prices[0].ID"
"Prices[1].Value"
"Prices[1].ID"
...
Run Code Online (Sandbox Code Playgroud)
ViewModel包含一个Price属性:
public List<Price> Prices { get; set; }
Run Code Online (Sandbox Code Playgroud)
只要用户在Value输入中输入十进制可转换字符串,默认模型绑定器就可以正常工作.我想允许输入"100美元".
我的ModelBinder for Price类型到目前为止:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Price res = new Price();
var form = controllerContext.HttpContext.Request.Form;
string valueInput = ["Prices[0].Value"]; //how to determine which index I am processing?
res.Value = ParseInput(valueInput)
return res;
}
Run Code Online (Sandbox Code Playgroud)
如何实现正确处理数组的自定义模型Binder?
arrays asp.net-mvc imodelbinder modelbinders custom-model-binder
假设我有一个User实体,我想在构造函数中将它的CreationTime属性设置为DateTime.Now.但作为单元测试采用者,我不想直接访问DateTime.Now,而是使用ITimeProvider:
public class User {
public User(ITimeProvider timeProvider) {
// ...
this.CreationTime = timeProvider.Now;
}
// .....
}
public interface ITimeProvider {
public DateTime Now { get; }
}
public class TimeProvider : ITimeProvider {
public DateTime Now { get { return DateTime.Now; } }
}
Run Code Online (Sandbox Code Playgroud)
我在我的ASP.NET MVC 2.0应用程序中使用NInject 2.我有一个UserController和两个Create方法(一个用于GET,一个用于POST).用于GET的那个是直接的,但是用于POST的那个不是那么直接而不是那么向前:P因为我需要弄乱模型绑定器告诉它获得ITimeProvider的实现的引用以便能够构造用户实例.
public class UserController : Controller {
[HttpGet]
public ViewResult Create() {
return View();
}
[HttpPost]
public ActionResult Create(User user) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我还希望能够保留默认模型绑定器的所有功能.
有机会解决这个简单/优雅/等?:d
asp.net-mvc dependency-injection inversion-of-control model-binding custom-model-binder
我对于模型绑定器在ASP.Net MVC中的工作方式略有不解.
具体来说,BindModel()方法有一个ModelBindingContext参数,它保存模型名称和类型,但我不明白ModelBindingContext如何接收这些值.
必须从发布的表单值或查询字符串参数或其他数据源填充MVC模型.但是什么机制决定了传递给ModelBindingContext的模型类型,以及如何选择一种模型类型而不是另一种模型类型,甚至是(包括)包含各个发布值的简单列表?
在我看来,ModelBindingContext"知道"它所交付的模型的类型,我不确定它的来源或填充它所涉及的工作流程.
我看到人们设置他们的自定义模型绑定器的例子,如下所示:
// global.asax
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(YourModel), new YourBinder());
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试它时,它不会编译(.Binders找不到).是什么赋予了?
我有一个自定义结构TimeOfDay,在这样的视图模型中使用它:
public class MyViewModel
{
public TimeOfDay TimeOfDay { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个自定义模型绑定器TimeOfDayModelBinder,并在Global.asax.cs中注册它,如下所示:
ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder());
Run Code Online (Sandbox Code Playgroud)
一切都很好.但是,如果我将我的视图模型更改为:
public class MyViewModel
{
public TimeOfDay? TimeOfDay { get; set; } // Now nullable!
}
Run Code Online (Sandbox Code Playgroud)
我的自定义模型绑定器不再被调用.我知道该属性不再是TimeOfDay的类型,而是一个不同的Nullable.这是否意味着我应该在Global.asax.cs中添加我的自定义模型绑定器两次,如下所示:
ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder());
ModelBinders.Binders.Add(typeof(TimeOfDay?), new TimeOfDayModelBinder());
Run Code Online (Sandbox Code Playgroud)
它有效,但有一些我不喜欢的东西.这是否真的有必要将我的类型处理为可空,或者是否有我缺少的东西?
在我的项目中,我希望允许用户以2种格式输入双值:使用','或'.' 作为分隔符(我对指数形式不感兴趣).默认值为分隔符'.' 不工作.我希望这种行为适用于复杂模型对象中的所有双属性(目前我使用的是包含标识符和值的对象集合).
我应该使用什么:价值提供商或模型粘合剂?请显示解决我的问题的代码示例.
asp.net-mvc custom-model-binder value-provider asp.net-mvc-3
我正在使用NInject与NInject.Web.Mvc.
首先,我创建了一个简单的测试项目,我希望IPostRepository在同一Web请求期间在控制器和自定义模型绑定器之间共享一个实例.在我的真实项目中,我需要这个,因为我遇到IEntityChangeTracker问题,我有效地有两个存储库访问相同的对象图.因此,为了简化我的测试项目,我只是想共享一个虚拟存储库.
我遇到的问题是它适用于第一个请求,就是这样.相关代码如下.
NInjectModule:
public class PostRepositoryModule : NinjectModule
{
public override void Load()
{
this.Bind<IPostRepository>().To<PostRepository>().InRequestScope();
}
}
Run Code Online (Sandbox Code Playgroud)
CustomModelBinder:
public class CustomModelBinder : DefaultModelBinder
{
[Inject]
public IPostRepository repository { get; set; }
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
repository.Add("Model binder...");
return base.BindModel(controllerContext, bindingContext);
}
}
public class HomeController : Controller
{
private IPostRepository repository;
public HomeController(IPostRepository repository)
{
this.repository = repository;
}
public ActionResult Index(string whatever)
{
repository.Add("Action...");
return View(repository.GetList());
}
}
Run Code Online (Sandbox Code Playgroud)
Global.asax中: …
asp.net-mvc dependency-injection ninject model-binding custom-model-binder
现在我ViewModel看起来像这样:
public class MyViewModel
{
private readonly IMyService myService;
public ClaimantSearchViewModel(IMyService myService)
{
this.myService = myService;
}
}
Run Code Online (Sandbox Code Playgroud)
我的Controller消费ViewModel看起来像这样:
public class MyController : Controller
{
private readonly IMyService myService;
public HomeController(IMyService myService)
{
this.myService = myService;
}
public IActionResult Index()
{
var model = new MyViewModel(myService);
return View(model);
}
[HttpPost]
public async Task<IActionResult> Find()
{
var model = new MyViewModel(myService);
await TryUpdateModelAsync(model);
return View("Index", model);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要的是我Controller的样子是这样的:
public class MyController : …Run Code Online (Sandbox Code Playgroud) c# dependency-injection autofac custom-model-binder asp.net-core-mvc
我在 WebAPI 中有一个自定义模型绑定器,它使用来自“Sytem.Web.Http.ModelBinding”命名空间的以下方法,这是为 Web API 创建自定义模型绑定器的正确命名空间:
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
}
Run Code Online (Sandbox Code Playgroud)
我有一个HTTP POST控制器,我想使用这个自定义模型绑定器。发布的对象包含大约 100 个字段。我想换 2 个。我需要的是发生默认模型绑定,然后为这两个字段操作该模型绑定对象,以便一旦控制器接收到对象,它就是原始的。
问题是我似乎无法使用上述模型绑定方法中的默认绑定器对我的对象进行模型绑定。在MVC曾有如下:
base.BindModel(controllerContext, bindingContext);
同样的方法也没有在工作的WebAPI。也许我要解决这个错误,还有另一种方法可以完成我想要的,所以请建议自定义模型绑定器是否不是正确的方法。我试图阻止做的是必须在控制器内操作发布的对象。我可以在模型绑定后在技术上做到这一点,但我试图在调用堆栈的早期执行此操作,以便控制器无需担心这两个字段的自定义操作。
如何bindingContext在我的自定义模型绑定器中启动默认模型绑定,以便我有一个完全填充的对象,然后我可以在返回之前操作/按摩我需要的最后 2 个字段?
我在 .NET 6 项目中有一个端点Microsoft.NET.Sdk.Web,它使用标准 [FromQuery] 将查询字符串反序列化为 .NET 对象
[Route("[controller]")]
public class SamplesController
: ControllerBase
{
[HttpGet]
public IActionResult Get([FromQuery]QueryModel queryModel)
{
if (!queryModel.Status.HasValue)
{
return BadRequest("Problem in deserialization");
}
return Ok(queryModel.Status.Value.GetEnumDisplayName());
}
}
Run Code Online (Sandbox Code Playgroud)
该模型包含一个枚举
public class QueryModel
{
/// <summary>
/// The foo parameter
/// </summary>
/// <example>bar</example>
public string? Foo { get; init; } = null;
/// <summary>
/// The status
/// </summary>
/// <example>on-hold</example>
public Status? Status { get; set; } = null;
}
Run Code Online (Sandbox Code Playgroud)
枚举具有EnumMember …
enums jsonserializer custom-model-binder asp.net-core system.text.json
asp.net-mvc ×6
c# ×3
modelbinders ×2
arrays ×1
asp.net-core ×1
autofac ×1
enums ×1
global-asax ×1
imodelbinder ×1
ninject ×1