我有来自具有不同内容的特定操作的传入请求(来自Facebook for Credits处理),因此我有不同的模型类来处理它.
这是我的行动:
public ActionResult Index([ModelBinder(typeof(FacebookCreditModelBinder))] IFacebookRequest facebookRequest)
{
    if (facebookRequest is FacebookPaymentsGetItemsRequest)
    {
        // do whatever
    }
}
这是我的模型活页夹.
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); 
    }
}
我想创建一个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 …我坚持这个非常奇怪的问题.
我有一个名为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 ");
            ...........
从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);
        }
    }
但是当我尝试使用Fiddler访问此控制器时.我得到一个错误说 …
我在我的应用程序中使用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>
单击该按钮时,我会读取这些日期选择器客户端的值,并向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
    }
我的模型如下:
public class DateRangeParam
    {
        #region Constructors and Destructors
        /// <summary>
        /// Initializes a new instance of …c# asp.net-mvc model-binding custom-model-binder kendo-datepicker
我有一个接受以下模型的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; } 
}
我还有一个自定义模型绑定器将POST数据绑定到IEnumerable<LanguageItem>.
问题是我如何使DataAnnotations验证工作?
我有一个实现的视图模型IValidatableObject包含一个字符串和另一个视图模型的集合,如下所示:
public sealed class MainViewModel
{
    public string Name { get; set; }
    public ICollection<OtherViewModel> Others { get; set; }
}
我的验证Others使用以下提供的合同检查每个对象与不同的规则IValidatableObject:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    foreach (var other in this.Others)
    {
        // validate or yield return new ValidationResult
    }
}
由于真实的复杂结构,MainViewModel我不得不创建一个自定义模型绑定器,它重新构建模型并将POST数据分配给相关组件.我得到的问题是没有任何东西得到验证,导致上下文级别的验证错误,因为它违反了某些数据库约束,我不确定我做错了什么 - 我以为我ModelState.IsValid会Validate在我的视图上调用该方法模型,但它似乎没有那样下去.
我的模型绑定器看起来像这样:
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 …我正在使用自定义模型绑定器,以便在我的模型绑定中放置一些自定义逻辑.
这是我的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; }
}
步骤DTO:
public class StepDto
{
    public int Id { get; set; }
    [MaxLength(100)]
    public string Description { get; set; }
    public StepType StepType { get; set; }
}
ResourceDTO:
public class ResourceDTO
{
    public int Id { get; set; }
    [MaxLength(250), Required]
    public …model-binding custom-model-binder asp.net-web-api asp.net-web-api2
我正在构建一个简单的搜索、排序、页面功能。我附上了下面的代码。以下是用例:
我的目标是通过每个请求传递“当前过滤器”以保留它们,特别是在排序和分页时。
我不想用许多(如果不是太多)参数污染我的操作方法,而是考虑使用保存当前过滤器的通用类型参数。
我需要一个能够实现此目的的自定义模型绑定器。
有人可以发布一个示例实现吗?
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; …asp.net-mvc generic-type-argument actionmethod custom-model-binder asp.net-core