内部模型的定制模型活页夹
我有一个像这样的模型:
public class MainModel
{
public string Id {get;set;}
public string Title {get;set;}
public TimePicker TimePickerField {get;set;}
}
TimePicker
是一个内部模型,如下所示:
public class TimePicker
{
public TimeSpan {get;set;}
public AmPmEnum AmPm {get;set;}
}
我正在尝试为内部模型创建自定义模型绑定: TimePicker
问题是:如何获取以表单提交到 TimePicker 模型字段的自定义模型绑定器中的值?
如果我尝试像这样得到它:
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
我只是在 value
中得到 null
。
我不确定如何正确实现模型绑定器。
public class TimePickerModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
var result = new TimePicker();
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value != null)
{
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
try
{
//result = Duration.Parse(value.AttemptedValue);
}
catch (Exception ex)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.Message);
}
}
return result;
}
}
I got a model like this:
public class MainModel
{
public string Id {get;set;}
public string Title {get;set;}
public TimePicker TimePickerField {get;set;}
}
TimePicker
is an inner model which looks like this:
public class TimePicker
{
public TimeSpan {get;set;}
public AmPmEnum AmPm {get;set;}
}
I'm trying to create a custom model binding for inner model: TimePicker
The question is: How do I get values in custom model binder which was submitted in form into TimePicker
model fields?
If I try to get it like this:
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
I just get null
in value
.
I'm not sure how to implement the model binder correctly.
public class TimePickerModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
var result = new TimePicker();
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value != null)
{
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);
try
{
//result = Duration.Parse(value.AttemptedValue);
}
catch (Exception ex)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.Message);
}
}
return result;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
以下内容对我有用。
模型:
控制器:
视图(
~/Views/Home/Index.cshtml
):自定义编辑器模板(
~/Views/Shared/EditorTemplates/TimePicker.cshtml
),它合并了Time
和AmPm
属性放入单个输入字段中,稍后需要自定义模型绑定器,以便在提交表单时拆分它们:以及模型绑定器:
最后注册你的模型绑定器
Application_Start
:The following works for me.
Model:
Controller:
View (
~/Views/Home/Index.cshtml
):Custom editor template (
~/Views/Shared/EditorTemplates/TimePicker.cshtml
) which merges theTime
andAmPm
properties into a single input field and which will require a custom model binder later in order to split them when the form is submitted:and the model binder:
and finally register your model binder in
Application_Start
: