标签: custom-model-binder

如何构建自定义模型绑定器,根据请求上下文返回不同类型的模型?

我有来自具有不同内容的特定操作的传入请求(来自Facebook for Credits处理),因此我有不同的模型类来处理它.

这是我的行动:

public ActionResult Index([ModelBinder(typeof(FacebookCreditModelBinder))] IFacebookRequest facebookRequest)
{
    if (facebookRequest is FacebookPaymentsGetItemsRequest)
    {
        // do whatever
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的模型活页夹.

public class FacebookCreditModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var binder = new DefaultModelBinder();
        // how to change the model here in the bindingContext?
        return binder.BindModel(controllerContext, bindingContext); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个FacebookPaymentsGetItemsRequest对象,如果传入的var"方法"是"payments_get_items",FacebookPaymentsStatusUpdateRequestif方法是"payments_status_update",我不知道如何在bindingContext中更改模型的类型.是否可以在自定义模型绑定器中更改模型的类型?


其他方法:我也尝试使用BindModel并且我能够返回正确的对象,但是所有属性都为null,因为它没有被默认的模型绑定器填充:

public override object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
{
    NameValueCollection form = controllerContext.HttpContext.Request.Form;
    if (form.Get("method") == "payments_get_items")
    {
        return new …
Run Code Online (Sandbox Code Playgroud)

custom-model-binder c#-4.0 asp.net-mvc-3

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

在Asp.Net Web API中实现自定义模型绑定器时出错

我坚持这个非常奇怪的问题.
我有一个名为AttendanceControllerderived 的API控制器APIControllerFA,从ApiController
这里派生出来的是代码

public class AttendanceController : ApiControllerFA
    {
        public HttpResponseMessage PostAttendance([ModelBinder(typeof(AttendanceRegistrationModelBinder))]AttendanceRegistrationModel model)
        {
            //checking model state for errors
            //throw new Exception("Just to throw an error ");

            ...........
Run Code Online (Sandbox Code Playgroud)

从PostAttendance方法可以看出,我有一个自定义ModelBinder命名AttendenceRegistrationModelBinder,这是代码

public class AttendanceRegistrationModelBinder :  DefaultModelBinder
    {

        protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.Name == "formJson")
            {
                string val = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name).AttemptedValue;
                dynamic jsonVal = JsonConvert.DeserializeObject(val);
                propertyDescriptor.SetValue(bindingContext.Model, jsonVal);
                return;
                //SetProperty(controllerContext, bindingContext,propertyDescriptor,jsonVal);
            }
            base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
        }


    }
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用Fiddler访问此控制器时.我得到一个错误说 …

c# custom-model-binder asp.net-mvc-4 asp.net-web-api

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

MVC日期时间模型绑定

我在我的应用程序中使用2个kendo日期选择器:

<div class="span12">
    <div class="span2" style="text-align: right">
        Start Date:
    </div>
    <div class="span2">
        @(Html.Kendo().DatePickerFor(m=>m.StartDate))
    </div>
    <div class="span2" style="text-align: right">
        End Date:
    </div>
    <div class="span2">
        @(Html.Kendo().DatePickerFor(m=>m.EndDate))
    </div>
    <div class="span4">
        <button class="btn btn-primary" onclick="getGraphData()">Show</button>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

单击该按钮时,我会读取这些日期选择器客户端的值,并向API控制器发出POST.

我遇到的问题有时是DateTime参数被错误地解析,我使用的是en-GB文化(在我的web.config中指定),但是给定日期为2014年3月1日(3月1日),当值为由模型装订器处理,它被解释为03/01/2014(1月3日).

我的javascript如下:

function getGraphData() {

        var startDatePicker = $("#StartDate").data("kendoDatePicker");
        var endDatePicker = $("#EndDate").data("kendoDatePicker");
        var param = {
            StartDate: kendo.toString(startDatePicker.value().toLocaleDateString(), "dd/MM/yyyy"),
            EndDate: kendo.toString(endDatePicker.value().toLocaleDateString(), "dd/MM/yyyy")
        };
       // Do post here

    }
Run Code Online (Sandbox Code Playgroud)

我的模型如下:

public class DateRangeParam
    {
        #region Constructors and Destructors

        /// <summary>
        /// Initializes a new instance of …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc model-binding custom-model-binder kendo-datepicker

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

DataAnnotations验证和自定义模型绑定器

我有一个接受以下模型的action方法 - LanguagesViewModel:

public class LanguagesViewModel : ViewModelBase
{
 IEnumerable<LanguageItem> Languages { get; set; }
}

public class LanguageItem
{
 [Required]
 public int LanguageId { get; set; }

 [Required]
 public int SpeakingSkillId { get; set; }

 [Required]
 public int WritingSkillId { get; set; }

 [Required]
 public int UnderstandingSkillId { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

我还有一个自定义模型绑定器将POST数据绑定到IEnumerable<LanguageItem>.

问题是我如何使DataAnnotations验证工作?

custom-model-binder data-annotations asp.net-mvc-2

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

自定义模型绑定后验证视图模型

我有一个实现的视图模型IValidatableObject包含一个字符串和另一个视图模型的集合,如下所示:

public sealed class MainViewModel
{
    public string Name { get; set; }
    public ICollection<OtherViewModel> Others { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的验证Others使用以下提供的合同检查每个对象与不同的规则IValidatableObject:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    foreach (var other in this.Others)
    {
        // validate or yield return new ValidationResult
    }
}
Run Code Online (Sandbox Code Playgroud)

由于真实的复杂结构,MainViewModel我不得不创建一个自定义模型绑定器,它重新构建模型并将POST数据分配给相关组件.我得到的问题是没有任何东西得到验证,导致上下文级别的验证错误,因为它违反了某些数据库约束,我不确定我做错了什么 - 我以为我ModelState.IsValidValidate在我的视图上调用该方法模型,但它似乎没有那样下去.

我的模型绑定器看起来像这样:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    int modelId = (int)controllerContext.RouteData.Values["id"];

    // query the database and re-build the components of the view …
Run Code Online (Sandbox Code Playgroud)

validation custom-model-binder asp.net-mvc-3

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

自定义模型绑定程序:无法绑定参数'xxx',因为它具有冲突的属性

我正在使用自定义模型绑定器,以便在我的模型绑定中放置一些自定义逻辑.

这是我的DTO:

public class TaskDto
{
    public int Id { get; set; }

    [MaxLength(100), Required]
    public string Name { get; set; }

    public List<StepDto> Steps { get; set; }

    public List<ResourceDTO> Resources { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

步骤DTO:

public class StepDto
{
    public int Id { get; set; }

    [MaxLength(100)]
    public string Description { get; set; }

    public StepType StepType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ResourceDTO:

public class ResourceDTO
{
    public int Id { get; set; }

    [MaxLength(250), Required]
    public …
Run Code Online (Sandbox Code Playgroud)

model-binding custom-model-binder asp.net-web-api asp.net-web-api2

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

mvc 操作方法中泛型类型参数的 dot net core 自定义模型绑定

我正在构建一个简单的搜索、排序、页面功能。我附上了下面的代码。以下是用例:

  1. 我的目标是通过每个请求传递“当前过滤器”以保留它们,特别是在排序和分页时。

  2. 我不想用许多(如果不是太多)参数污染我的操作方法,而是考虑使用保存当前过滤器的通用类型参数。

  3. 我需要一个能够实现此目的的自定义模型绑定器。

有人可以发布一个示例实现吗?

PS:我也在探索替代方案,而不是来回传递复杂的对象。但我需要将此路线作为最后的手段,并且我找不到自定义模型绑定泛型类型参数的好示例。任何指向此类示例的指针也会有所帮助。谢谢!。

public async Task<IActionResult> Index(SearchSortPage<ProductSearchParamsVm> currentFilters, string sortField, int? page)
{
    var currentSort = currentFilters.Sort;
    // pass the current sort and sortField to determine the new sort & direction
    currentFilters.Sort = SortUtility.DetermineSortAndDirection(sortField, currentSort);
    currentFilters.Page = page ?? 1;

    ViewData["CurrentFilters"] = currentFilters;

    var bm = await ProductsProcessor.GetPaginatedAsync(currentFilters);

    var vm = AutoMapper.Map<PaginatedResult<ProductBm>, PaginatedResult<ProductVm>>(bm);

    return View(vm);
}

public class SearchSortPage<T> where T : class
{
    public T Search { get; set; }
    public Sort Sort { get; set; …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc generic-type-argument actionmethod custom-model-binder asp.net-core

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