这是我的自定义模型绑定器.我将断点设置为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) 我为抽象类创建了一个自定义绑定器.绑定器决定使用哪种实现.它工作得很好,但是当我将一个在抽象类中不存在的属性添加到子类时,它总是为null.
下面是抽象类的代码Pet和派生类Dog和Cat.
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) 我有一个类我模型绑定,我想使用它的输出缓存.我找不到一种方法来访问绑定对象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) 我在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获得相同结果的最佳方法是什么?
我相信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助手?
谢谢.
我已经看到了许多类似的问题,但似乎没有一个答案让我比我更进一步.
我有一个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)及其任何子类的内容.
很高兴发布额外的代码,如果有人需要看到它.
在我的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) 我在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
在将现有的Web API 2应用程序移植到ASP.NET Core时,我注意到现在需要将应用于FromBodyAttribute操作方法的参数(带有JSON有效负载的POST请求):
[HttpPost]
public IActionResult([FromBody]MyComplexType parameter){ ... }
Run Code Online (Sandbox Code Playgroud)
我尝试搜索文档,但没有找到任何能解释此决定背后原因的信息。我确实找到了一条帖子,指出这样做是为了提高安全性(CSRF方案)。
有人可以提供更多有关此的信息吗?
谢谢。
路易斯
对于具有decimal属性的模型,如果来自客户端的值包含逗号作为千位分隔符,则模型绑定将失败。
我们该如何解决呢?任何解决方案(全局上,控制器/操作本地或模型/属性本地)都是好的。
我有一个解决方法,那就是拥有一个string可以读写的属性decimal。但我正在寻找更清洁的解决方案。
model-binding ×10
asp.net-mvc ×5
c# ×3
.net-core ×1
asp.net-core ×1
backbone.js ×1
csrf ×1
marionette ×1
model ×1
modelbinders ×1
outputcache ×1
selectlist ×1
viewmodel ×1