所以我试图应用Darin Dimitrov 的回答,但在我的实现中 bindingContext.ModelName 等于“”。
这是我的视图模型:
public class UrunViewModel
{
public Urun Urun { get; set; }
public Type UrunType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是发布模型类型的视图部分:
@model UrunViewModel
@{
ViewBag.Title = "Tablo Ekle";
var types = new List<Tuple<string, Type>>();
types.Add(new Tuple<string, Type>("Tuval Bask?", typeof(TuvalBaski)));
types.Add(new Tuple<string, Type>("Ya?l? Boya", typeof(YagliBoya)));
}
<h2>Tablo Ekle</h2>
@using (Html.BeginForm("UrunEkle", "Yonetici")) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Tablo</legend>
@Html.DropDownListFor(m => m.UrunType, new SelectList(types, "Item2", "Item1" ))
Run Code Online (Sandbox Code Playgroud)
这是我的自定义模型绑定器:
public class UrunBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext …Run Code Online (Sandbox Code Playgroud) 当我使用默认模型绑定将表单参数绑定到作为操作参数的复杂对象时,框架会记住传递给第一个请求的值,这意味着对该操作的任何后续请求都会获得与第一个请求相同的数据.参数值和验证状态在不相关的Web请求之间保持不变.
这是我的控制器代码(service表示访问应用程序的后端):
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Create()
{
return View(RunTime.Default);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(RunTime newRunTime)
{
if (ModelState.IsValid)
{
service.CreateNewRun(newRunTime);
TempData["Message"] = "New run created";
return RedirectToAction("index");
}
return View(newRunTime);
}
Run Code Online (Sandbox Code Playgroud)
我的.aspx视图(强类型为ViewPage<RunTime>)包含如下指令:
<%= Html.TextBox("newRunTime.Time", ViewData.Model.Time) %>
Run Code Online (Sandbox Code Playgroud)
这使用了DefaultModelBinder类,它用于自动绑定我的模型的属性.
我点击页面,输入有效数据(例如时间= 1).应用程序正确保存新对象时间= 1.然后我再次点击它,输入不同的有效数据(例如时间= 2).但是,保存的数据是原始数据(例如,时间= 1).这也会影响验证,因此如果我的原始数据无效,那么我将来输入的所有数据都将被视为无效.重新启动IIS或重建我的代码会刷新持久状态.
我可以通过编写自己的硬编码模型绑定器来解决问题,其中一个基本的简单示例如下所示.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([ModelBinder(typeof (RunTimeBinder))] RunTime newRunTime)
{
if (ModelState.IsValid)
{
service.CreateNewRun(newRunTime);
TempData["Message"] = "New run created";
return RedirectToAction("index");
}
return View(newRunTime);
}
internal class RunTimeBinder : DefaultModelBinder
{ …Run Code Online (Sandbox Code Playgroud) asp.net-mvc castle-windsor inversion-of-control defaultmodelbinder
我试图让UpdateModel填充一个在编译时设置为只有接口的模型.例如,我有:
// View Model
public class AccountViewModel {
public string Email { get; set; }
public IProfile Profile { get; set; }
}
// Interface
public interface IProfile {
// Empty
}
// Actual profile instance used
public class StandardProfile : IProfile {
public string FavoriteFood { get; set; }
public string FavoriteMusic { get; set; }
}
// Controller action
public ActionResult AddAccount(AccountViewModel viewModel) {
// viewModel is populated already
UpdateModel(viewModel.Profile, "Profile"); // This isn't working.
}
// Form …Run Code Online (Sandbox Code Playgroud) 多年来我做了ASP.NET Web表单开发我被一个专有库所破坏,这让我可以做以下事情:
UpdateToObject(ControlsCollection, obj)
UpdateFromObject(ControlsCollection, obj)
Run Code Online (Sandbox Code Playgroud)
概念上,代码做了一些与MVC Model Binder非常相似的东西,即将表单的发布值作为输入,它将填充自定义对象.基本上它使开发人员免于做猴子代码,如
employee.Name = txtName.Text;
employee.DOB = DateTime.Parse(txtDOB.Text);
Run Code Online (Sandbox Code Playgroud)
等等..
现在,这个专有的库在我参与的新项目中不可用,它是一个Web表单项目.所以我想知道是否有一种System.Web.Mvc.DefaultModelBinder在Web表单的上下文中使用的方法.目标是从域对象和背面实现简单和容易的控制,最好考虑验证注释.如果不可能,有人可能会指出我的开源解决方案来满足这种需求.我真的不想重写这样的代码.
提前致谢.
我有一个非常简单的课程:
public class FilterItem
{
public Dictionary<string, string> ItemsDictionary { get; set; }
public FilterItem()
{
ItemsDictionary = new Dictionary<string, string>();
}
}
Run Code Online (Sandbox Code Playgroud)
我想在客户端上填充字典中的数据,然后将其作为JSON对象传递给我的控制器操作.但无论我在客户端上尝试什么,DefaultModelBinder似乎都无法反序列化它.
以下是调用我的操作的示例javascript代码:
var simpleDictionary = {"ItemsDictionary": {"1": "5", "2": "7"}};
$.ajax({ cache: false, type: "POST", data: JSON.stringify(simpleDictionary),
contentType: "application/json; charset=utf-8",
url: "/Catalog7Spikes/GetFilteredProductsJson", success: function (data) {...});
Run Code Online (Sandbox Code Playgroud)
这是我的动作方法的简化版本:
[HttpPost]
public ActionResult GetFilteredProductsJson(FilterItem filterItem)
{
ProductsModel productsModel = new ProductsModel();
return View("SevenSpikes.Nop.UI.Views.Products", productsModel);
}
Run Code Online (Sandbox Code Playgroud)
请注意,相反的工作.当作为JsonResult传递时,FilterItem对象被成功序列化并作为JSON对象传递给客户端.然而,尝试反过来却行不通.
我读了关于Connect的票,并认为解决方法可行,但事实并非如此.
是否有可能使用ASP.NET MVC 3中的DefaultModelBinder反序列化.NET字典?
我正在为视图模型创建自定义模型活页夹,实现 IModelBinder
我的视图模型中有很多属性,其中大多数不需要任何自定义绑定。与其从单独显式设置模型上的所有属性值,不如让ModelBindingContext我能够获得为我绑定模型的框架,然后执行任何自定义绑定:
public class ApplicationViewModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
// get .net core to bind values on model
// Cary out any customization of the models properties
bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);
return Task.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想执行默认的模型绑定,然后应用自定义绑定,类似于本SO帖子中采用的方法,但适用于.NET Core,而不是框架。
我以为应用默认绑定会很简单,但是还没有找到方法。我相信该解决方案将涉及ComplexTypeModelBinder和ComplexTypeModelBinderProvider类,但似乎无法找出解决方法。
我知道我可以在POST请求命中我的控制器方法时进行任何更改,但这似乎是错误的位置和错误的时间。
defaultmodelbinder model-binding custom-model-binder asp.net-core-mvc asp.net-core
第一; 我知道我不需要测试MVC的内部,但我真的需要套件测试流入我们系统的数据.
我希望如何在不模仿所有HTTP上下文的情况下,测试objectA(表单集合,字典,集合,对象等)是否符合objectAModel?
我不想实例化我的控制器或调用操作.我只是想测试我的新对象是否使模型状态无效.
我希望我能简单地写一下
var modelState = new ModelBindingContext<objectAModel>().validate(objectA);
Run Code Online (Sandbox Code Playgroud) asp.net-mvc unit-testing defaultmodelbinder modelbinders modelstate
我在我的模型上有一组对象,我使用EditFor函数在View中渲染,我有一个EditorTemplate,负责实际渲染每个对象.
@Html.EditorFor(model => model.MyObjects)
Run Code Online (Sandbox Code Playgroud)
这已经运行了一段时间了,当你检查html时,我的文本框以model属性为前缀,后面跟着它们来自的集合的索引.
<input class="text-box single-line" id="MyObjects_2__SomeProperty"
name="MyObjects[2].SomeProperty" type="Text" value="" />
Run Code Online (Sandbox Code Playgroud)
但是我最近开始在集合的模型元数据中使用ShowForEdit和ShowForDisplay属性,如果ShowForEdit不是真的,在我的编辑器模板的第一行,我只是跳过它.
@if (!ViewData.ModelMetadata.ShowForEdit)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
但由于这些都是在html中编入索引,当我尝试通过回发将此集合保存回viewmodel时,由于依赖于索引编号而失败.当我检查它的值时,我的视图模型中缺少缺少索引后的集合中的每个项目.
在这种情况下,它实际上是我正在跳过的集合中的第一个项目,因为我不希望它在编辑视图中可见,但是因为当我回发html中的第一个索引是1(而不是0)像往常一样),但是当你尝试保存更改时这是一个问题.使用javascript更改DOM时,这也是一个问题.
当html表示集合中的一个或多个索引不存在时,有没有其他人遇到默认模型绑定器读取回发数据的能力?
是否有模型粘合剂来处理这个问题?
asp.net-mvc defaultmodelbinder model-binding modelbinders asp.net-mvc-3
我正在使用ASP.NET MVC3,我想知道默认的模型绑定器绑定到公共属性,但不绑定到公共字段.
通常我只是用属性定义模型类,但有时我使用一些包含一些字段的预定义类.每次我必须调试并记住模型绑定器只是不喜欢字段.
问题:背后的原因是什么?
我的视图模型中的某些decimal和decimal?属性被标记为"百分比"数据类型以及其他数据注释,例如:
[DataType("Percent")]
[Display(Name = "Percent of foo completed")]
[Range(0, 1)]
public decimal? FooPercent { get; set; }
Run Code Online (Sandbox Code Playgroud)
我想允许用户在输入数据方面有一些灵活性,即有或没有百分号,中间空格等.但我仍然希望使用该DefaultModelBinder行为来获取其所有功能,例如检查RangeAttribute和添加适当的验证消息.
有没有办法解析和更改模型值,然后传递它?这是我正在尝试的,但我得到一个运行时异常.(忽略实际的解析逻辑;这不是它的最终形式.此时我只对模型替换问题感兴趣.)
public class PercentModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelMetadata.DataTypeName == "Percent")
{
ValueProviderResult result =
bindingContext.ValueProvider.GetValue(
bindingContext.ModelName);
if (result != null)
{
string stringValue =
(string)result.ConvertTo(typeof(string));
decimal decimalValue;
if (!string.IsNullOrWhiteSpace(stringValue) &&
decimal.TryParse(
stringValue.TrimEnd(new char[] { '%', ' ' }),
out decimalValue))
{
decimalValue /= …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×5
modelbinders ×4
c# ×2
asp.net ×1
asp.net-core ×1
json ×1
modelstate ×1
unit-testing ×1
webforms ×1