标签: model-binding

自定义模型绑定器未触发

这是我的自定义模型绑定器.我将断点设置为BindModel但不会被此控制器操作触发:

public ActionResult Create(TabGroup tabGroup)
Run Code Online (Sandbox Code Playgroud)

...

public class BaseContentObjectCommonPropertiesBinder : DefaultModelBinder
{
    public new object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext);
        obj.Modified = DateTime.Now;
        obj.Created = DateTime.Now;
        obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name;
        return obj;
    }
Run Code Online (Sandbox Code Playgroud)

我的注册:

//尝试了这两行

ModelBinders.Binders[typeof(TabGroup)] = new BaseContentObjectCommonPropertiesBinder();
ModelBinders.Binders.Add(typeof(TabGroup), new BaseContentObjectCommonPropertiesBinder());
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc model-binding modelbinders

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

JSON自定义绑定器null用于派生抽象类asp.net mvc

我为抽象类创建了一个自定义绑定器.绑定器决定使用哪种实现.它工作得很好,但是当我将一个在抽象类中不存在的属性添加到子类时,它总是为null.

下面是抽象类的代码Pet和派生类DogCat.

public abstract class Pet
{
    public string name { get; set; }
    public string species { get; set; }
    abstract public string talk { get; }
}

public class Dog : Pet
{
    override public string talk { get { return "Bark!"; } }
}
public class Cat : Pet
{
    override public string talk { get { return "Miaow."; } }
    public string parasite { get;set; } 
}


public class DefaultPetBinder …
Run Code Online (Sandbox Code Playgroud)

c# defaultmodelbinder model-binding asp.net-mvc-3

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

VaryByCustom和模型绑定

我有一个类我模型绑定,我想使用它的输出缓存.我找不到一种方法来访问绑定对象GetVaryByCustomString

例如:

public class MyClass
{
    public string Id { get; set; }
    ... More properties here
}

public class MyClassModelBinder : DefaultModelBinder
{
   public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   {
      var model = new MyClass();
      ... build the class       
      return model;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Global.cs中设置了绑定器

ModelBinders.Binders.Add(typeof(MyClass), new MyClassModelBinder());
Run Code Online (Sandbox Code Playgroud)

然后像这样使用输出缓存.

[OutputCache(Duration = 300, VaryByCustom = "myClass")]
public ActionResult MyAction(MyClass myClass)
{
   .......

public override string GetVaryByCustomString(HttpContext context, string custom)
{
   ... check we're working with 'MyClass'

   var routeData = …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc outputcache model-binding

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

使用Backbone.ModelBinder将类添加到元素的值中

我在Backbone.js Marionette项目中使用Backbone.ModelBinder.我有一个场景,我无法弄清楚如何使用ModelBinder自动更新我的模型/ UI.

我的模型有一个'status'字符串属性,有多个状态.在这个例子中,我将展示两个代码:'很快','某天'

在我的UI中,我有一个列表,我使用click事件来设置模型状态,并更新类以突出显示UI中的相关链接.

<dd id="status-soon"><a>Soon</a></dd>
<dd id="status-someday" class="active"><a>Someday</a></dd>

events: {
    'click #status-soon': 'setStatusSoon',
    'click #status-someday': 'setStatusSomeday'
},
setStatusSoon: function () {
    this.model.set('status', 'soon');
    this.$el.find('.status dd').removeClass('active');
    this.$el.find('#status-soon').addClass('active');
},
... etc
Run Code Online (Sandbox Code Playgroud)

感觉就像我这样做是一个冗长而笨重的方式!代码膨胀随着我需要支持的状态数量而增加.使用ModelBinder获得相同结果的最佳方法是什么?

model-binders model-binding backbone.js marionette

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

在ASP.NET MVC中查看模型及其对模型绑定的影响?

我相信ViewModels是一件好事.我刚刚尝试将部分应用程序转换为使用它们.但是我可能遇到了副作用,这是它们对模型绑定的影响,特别是Radiobutton助手的默认"检查"行为:

@Html.RadioButton("Value",Item.Value)
Run Code Online (Sandbox Code Playgroud)

如果默认模型具有"Value"属性,则上述方法有效.但是,如果我使用ViewModel,那么Value可能会降低一级,即:

没有VM

Model.Value
Run Code Online (Sandbox Code Playgroud)

使用VM:

Model.Content.Value;
MyContent = Model.Content.Value;
Run Code Online (Sandbox Code Playgroud)

这不再有效:

@Html.RadioButton("Value",Item.Value)
Run Code Online (Sandbox Code Playgroud)

也许我需要调整RB助手?

谢谢.

asp.net-mvc model-binding viewmodel asp.net-mvc-3

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

ASP.NET MVC 4 - 复杂类型和模型绑定/渲染

我已经看到了许多类似的问题,但似乎没有一个答案让我比我更进一步.

我有一个ViewModel,它包含一些复杂的类型,代表某些库存UI控件并附加了一些验证逻辑.我需要将这些内容渲染到基于EditorTemplate/DisplayTemplate的页面,并且还需要在提交表单时正确绑定属性,以便开发人员可以在其控制器中使用视图模型等.

这方面的简单例子是

public class TestViewModel

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

最简单的是,我需要开发人员能够用简单的方法为这个视图模型创建一个编辑器

@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

对于HierarchyField的任何可编辑部分,要在该类型的自定义EditorTemplate中设置字段.

通过使用自定义的MetaDataProvider并覆盖IsComplexType,我已经得到了允许这个渲染,虽然不是我完全熟悉的东西,但确实可以完成这项工作.这个解决方案的详细信息在这里(http://blogs.msdn.com/b/stuartleeks/archive/2010/04/01/collections-and-asp-net-mvc-templated-helpers-part-3.aspx?Rreirected =真)

我现在卡住尝试获取模型绑定以在提交表单时更新属性并调用HierarchyField类上的方法来执行一些自定义验证并根据该调用的结果更新ModelState.

我首先创建了一个DefaultModelBinder的子类,该子类在BindProperty覆盖中具有逻辑,以检查绑定的属性是否属于此类型.到目前为止都很好.当我想调用获取预期值的实例方法并尝试验证该值时出现问题.BindProperty方法为我提供了一个PropertyDescriptor实例,它允许我查找有关我的属性的元数据,以及一个带有ValueProvider的BindingContext,它允许我读取值,但是,没有从我的复杂类型返回的实例:

bindingContext.ValueProvider.GetValue(propertyDescriptor.Name + ".Value")
Run Code Online (Sandbox Code Playgroud)

其中propertyDescriptor.Name +".Value"等同于我在EditorTemplate中有以下事实:

@Html.TextBoxFor(model => model.Value)
Run Code Online (Sandbox Code Playgroud)

而不是类型,因为我显然只在回发的字段中引用了Value属性,我得到一个String [].我假设,为了让它工作,我将需要为HierarchyField注册某种类型的ValueProvider,但理想情况下我正在寻找更通用的东西,因为我有许多这些类型要设置,所有其子类是一个常见的抽象类型(它们都有一个名为'Value'的属性,它返回其值的字符串表示形式).

如果我诚实,整个过程看起来很痛苦,我觉得我错过了一些非常简单的事情.不幸的是,我确实需要这是通用的,因为有很多这些字段,我确实需要这个模型,或类似的字段来处理它们的验证,因为使用DataAnnotation验证属性无法做到这一点.我无法创建与特定视图模型绑定的自定义代码,我宁愿最小化与特定字段关联的代码,更喜欢适用于基类(FieldBase)及其任何子类的内容.

很高兴发布额外的代码,如果有人需要看到它.

asp.net-mvc model-binding asp.net-mvc-4

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

MVC 5 - MultiSelectList,使用Model"SelectList"属性绑定值

在我的MVC项目中,我遇到了将MultiSelectLists与我的Model属性绑定的问题.虽然我可以通过FormCollection对象获取值,但这些只是Selected ID.

以下是我的模型类,代表一个帖子.

public class PostModel
{
    [Required(ErrorMessage = "Id is a required field")]
    public int Id { get; set; }

    [Required(ErrorMessage = "Post Title is required")]
    [StringLength(500)]
    public string Title { get; set; }

    .......

    public SelectList UnassignedTags { get; set; }
    public SelectList AssignedTags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个Model类,并且有两个附加属性(UnassignedTags和AssignedTags),仅用于在屏幕上显示它们以及保持调用之间的值绑定.

单个帖子可以标记多个标签.在我的视图中,我想要两个多选列表.一个用于保存未分配的标签(文本和值),另一个用于保存已分配的标签(文本和值).

在我的视图中,我使用以下代码显示这些列表的多选列表.

@Html.ListBox("UnassignedTagss", Model.UnassignedTags, new { @class = "form-control" })

@Html.ListBox("AssignedTagss", Model.AssignedTags, new { @class = "form-control" })
Run Code Online (Sandbox Code Playgroud)

当我在屏幕上加载记录时,一切都很好.

加载后,我让用户通过javascript在列表之间移动项目.

当Form返回版本时会出现问题.我无法将Listbox值与我的模型属性绑定.

以下是我显示/编辑帖子记录的操作方法.

public ActionResult PostDtls(int postId)
{
    ….. …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc model model-binding selectlist

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

在.netcore Web API项目中的Web API调用中将空值传递给可为空的属性时出现问题

我在HttpGet动词中将空参数值传递给模型的属性时遇到问题。

我将.Net Core 2.1用于我的Web API项目。下面是我在控制器中的操作方法:

    [HttpGet("get")]
    public ActionResult GetData([FromQuery]MyTestModel model)
    {
        var result = new MyTestModel();
        return new JsonResult(result);
    }
Run Code Online (Sandbox Code Playgroud)

我的MyTestModel.cs就像:

 [Serializable]
public class MyTestModel
{
    public MyTestModel()
    {
        PageNo = 1;
        PageSize = 10;
    }
    public int ClientId { get; set; }
    public int? CandidateId { get; set; }
    public DateTime? FromDate { get; set; }
    public DateTime? ToDate { get; set; }
    public int PageNo { get; set; }
    public int PageSize { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我像这样调用API时: …

model-binding asp.net-core-mvc .net-core asp.net-core-webapi

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

ASP.NET Core:为什么在POST请求期间我们为什么必须使用FromBodyAttribute从JSON负载中混合参数?

在将现有的Web API 2应用程序移植到ASP.NET Core时,我注意到现在需要将应用于FromBodyAttribute操作方法的参数(带有JSON有效负载的POST请求):

[HttpPost]
public IActionResult([FromBody]MyComplexType parameter){ ... }
Run Code Online (Sandbox Code Playgroud)

我尝试搜索文档,但没有找到任何能解释此决定背后原因的信息。我确实找到了一条帖子,指出这样做是为了提高安全性(CSRF方案)。

有人可以提供更多有关此的信息吗?

谢谢。

路易斯

csrf model-binding asp.net-core

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

在ASP.NET Core MVC中,小数的模型绑定不接受千位分隔符

对于具有decimal属性的模型,如果来自客户端的值包含逗号作为千位分隔符,则模型绑定将失败。

我们该如何解决呢?任何解决方案(全局上,控制器/操作本地或模型/属性本地)都是好的。

我有一个解决方法,那就是拥有一个string可以读写的属性decimal。但我正在寻找更清洁的解决方案。

c# model-binding asp.net-core-mvc

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