我可以这样做吗?
[HttpPost]
public ActionResult Index(WizardViewModel wizard, IStepViewModel step)
{
我在global.asax.cs application_start中有以下内容
    ModelBinders.Binders.Add(typeof(IStepViewModel), new StepViewModelBinder());
    ModelBinders.Binders.Add(typeof(WizardViewModel), new WizardViewModelBinder());
所以,我试着看看有什么不对.这是我的新代码.似乎问题出在这个WizardViewModel和它的绑定器上.什么"告诉"应用程序期望和传入的向导模型?
[HttpPost]
public ActionResult Index(WizardViewModel wizard)
{
我在global.asax.cs application_start中有以下内容
    ModelBinders.Binders.Add(typeof(WizardViewModel), new WizardViewModelBinder());
namespace Tangible.Binders
{
    public class StepViewModelBinder : DefaultModelBinder
    {
        protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
        {
            var stepTypeValue = bindingContext.ValueProvider.GetValue("StepType");
            var stepType = Type.GetType((string)stepTypeValue.ConvertTo(typeof(string)), true);
            var step = Activator.CreateInstance(stepType);
            bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => step, stepType); 
            return step; 
        }
    }
    public class WizardViewModelBinder : DefaultModelBinder
    {
        protected …这与这个问题有关,但在这种情况下,它不是我要返回的东西,而是模型绑定.我正在使用Postmark来处理传入的电子邮件,这些电子邮件会发布到具有JSON有效负载的页面.
我有一个如下所示的模型和一个接受此JSON有效负载(使用application/json发布)并处理它的操作.
public class EmailModel
{
    public IDictionary<string, string> Headers { get; set; }
    public string From { get; set; }
    public string Cc { get; set; }
    public string HtmlBody { get; set; }
    public string TextBody { get; set; }
    public string ReplyTo { get; set; }
    public string Tag { get; set; }
    public string To { get; set; }
    public string MessageID { get; set; }
    public string MailboxHash { …model-view-controller asp.net-mvc model-binding custom-model-binder
我正在尝试将字符串路由参数绑定到枚举类型,如下所示
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "ValidateKey/{keyType}/{key}")]HttpRequestMessage req, KeyType keyType, string key, TraceWriter log)
当我到达端点时,代码给出了以下异常。
异常绑定参数“req”->从“System.String”到“MyCommon.KeyType”的转换无效。”
模型绑定器无法将字符串参数绑定到 Enum 类型。在 MVC 或 WebAPI 应用程序中,绑定到 Enum 工作正常,但 AzureFunction 似乎不支持该绑定。无论如何,是否可以在 AzureFunction 中插入自定义 ModelBinder 以使其正常工作?
enums defaultmodelbinder azure custom-model-binder azure-functions
我已经为一个属性编写了自定义模型绑定器。现在我正在尝试为其编写单元测试,但无法为模型绑定器创建对象。谁能帮我 ?以下是我必须为其编写测试的代码。
public class JourneyTypesModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        bool IsSingleWay = Convert.ToBoolean((bindingContext.ValueProvider.GetValue("IsSingleWay")).FirstValue);
        bool IsMultiWay = Convert.ToBoolean((bindingContext.ValueProvider.GetValue("IsMultiWay")).FirstValue);
        JourneyTypes journeyType = JourneyTypes.None;
        bool hasJourneyType = Enum.TryParse((bindingContext.ValueProvider.GetValue("JourneyType")).FirstValue, out journeyType);
        if (!hasJourneyType)
        {
            if (IsSingleWay)
                journeyType = JourneyTypes.Single;
            else journeyType = JourneyTypes.MultiWay;
        }
        bindingContext.Result = ModelBindingResult.Success(journeyType);
        return Task.CompletedTask;
    } }  
任何人都有使用多态模型绑定的自定义模型绑定的工作示例?我正在尝试使用 web api 项目的这个示例(用于 Mvc 而不是 Api 项目),但它不适用于 API 项目。我认为在填充方面缺少一些步骤,ValueProvider但我找不到与此相关的任何资源(AspNet Core 3.1)。
到目前为止我的尝试:
托斯:
public abstract class Device
{
    public string Kind { get; set; }
}
public class Laptop : Device
{
    public string CPUIndex { get; set; }
}
public class SmartPhone : Device
{
    public string ScreenSize { get; set; }
}
自定义模型绑定器实现:
public class DeviceModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context.Metadata.ModelType != typeof(Device))
        {
            return null;
        }
        var …我为我所包含的代码量道歉.我试图将它保持在最低限度.
我正在尝试在我的模型上使用自定义验证器属性以及自定义模型绑定器.属性和Binder分开工作很好,但如果我同时使用,则验证属性不再有效.
这是我的代码剪切的可读性.如果我省略了global.asax中的代码,则会启动自定义验证,但如果我启用了自定义绑定,则不会触发.
验证属性;
public class IsPhoneNumberAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        //do some checking on 'value' here
        return true;
    }
}
在我的模型中使用属性;
    [Required(ErrorMessage = "Please provide a contact number")]
    [IsPhoneNumberAttribute(ErrorMessage = "Not a valid phone number")]
    public string Phone { get; set; }
定制模型粘合剂;
public class CustomContactUsBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ContactFormViewModel contactFormViewModel = bindingContext.Model as ContactFormViewModel;
        if (!String.IsNullOrEmpty(contactFormViewModel.Phone))
            if (contactFormViewModel.Phone.Length > 10)
                bindingContext.ModelState.AddModelError("Phone", "Phone is too long."); …我确定之前有人问过这个,但我很难找到.
我正在使用Ninject从我的控制器中删除依赖项,以及存储库设计模式.
据我了解,这种方法的好处之一是,我可以轻松地将我的存储库和域实体分开,并且如果我愿意,可以使用另一个程序集.因此,我将域实体和存储库保存在外部程序集中,并可以从接口模拟我的所有依赖项.
似乎虽然我可以在大多数地方使用接口来引用我的域实体,但在模型绑定方面我必须使用对具体类的引用.我已经读过这与我理解的序列化有关,但是避免引用域实体创建单独模型的唯一方法是什么?
我可以用自定义模型绑定做什么吗?
一点背景:我是一位经验丰富的ASP.net开发人员,但对MVC来说是新手.
asp.net-mvc dependency-injection ninject repository-design custom-model-binder
我有一个这样的模型:
public class MainModel
{
   public string Id {get;set;}
   public string Title {get;set;}
   public TimePicker TimePickerField {get;set;}
}
TimePicker 是一个内部模型,看起来像这样:
public class TimePicker 
{
   public TimeSpan {get;set;}
   public AmPmEnum AmPm {get;set;}
}
我正在尝试为内部模型创建自定义模型绑定: TimePicker
问题是:如何在表单中提交到TimePicker模型字段的自定义模型绑定器中获取值?
如果我试着像这样:
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
我刚刚得到null在value.
我不确定如何正确实现模型绑定器.
public class TimePickerModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }
        var result = new TimePicker();
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); …custom-binding custom-model-binder asp.net-mvc-3 asp.net-mvc-2
我正在.net核心中构建动态表单创建者。“表单”将包含许多不同的表单元素。因此,表单模型将如下所示:
public class FormModel {
  public string FormName {get;set;}
  public List<IElements> Elements{get;set;}
}
我有类TextBoxElement,TextAreaElement,CheckBoxElement所有实现IElemets接口。我有EditorTemplates每个要素。呈现表单的代码效果很好。尽管由于ListInterfaces的原因,发布表单不起作用。
我一直在研究如何实现自定义模型联编程序,并在网络上看到了一些示例,但没有人工作。
如果有人可以向我展示如何为该示例实现自定义模型绑定程序,我将不胜感激。
计划B:将表单作为json发布到网络api,然后让JSON.Net对其进行隐蔽。我已经尝试过了,而且效果很好。在startup.cs中,我添加了:
services.AddMvc().AddJsonOptions(opts => opts.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto);
必要时返回类型。元素列表中的对象,而不是FormModel上的对象。但我真的很想知道如何使用自定义模型活页夹来解决它。
asp.net-mvc custom-model-binder asp.net-core asp.net-core-1.0
我需要为不同的客户端提供不同的表单,这些表单都可以在后台配置(最后在数据库中)
我最初的想法是为“Form”创建一个对象,它有一个“FormItem 字典”来描述表单字段。
然后我可以通过执行以下操作来新建一个动态表单(这将来自数据库/服务):
   private Form GetFormData()
    {
        var dict = new Dictionary<string, FormItem>();
        dict.Add("FirstName", new FormItem()
        {
            FieldType = Core.Web.FieldType.TextBox,
            FieldName = "FirstName",
            Label = "FieldFirstNameLabel",
            Value = "FName"
        });
        dict.Add("LastName", new FormItem()
        {
            FieldType = Core.Web.FieldType.TextBox,
            FieldName = "LastName",
            Label = "FieldLastNameLabel",
            Value = "LName"
        });
        dict.Add("Submit", new FormItem()
        {
            FieldType = Core.Web.FieldType.Submit,
            FieldName = "Submit",
            Label = null,
            Value = "Submit"
        });
        var form = new Form()
        {
            Method = "Post",
            Action = "Index",
            FormItems = dict …asp.net-mvc ×5
asp.net-core ×3
c# ×3
azure ×1
enums ×1
forms ×1
ninject ×1
unit-testing ×1
xunit ×1