Asp.net mvc 获取自定义模型绑定器的FormCollection out controllerContext
我有一个很好的函数,它接受了我的FormCollection(由控制器提供)。现在我想做一个模型绑定,让我的模型绑定器调用这个函数,它需要FormCollection。不知什么原因,我能找到它。我原以为会的Asp.net mvc 获取自定义模型绑定器的FormCollection out controllerContext,asp.net-mvc,modelbinders,Asp.net Mvc,Modelbinders,我有一个很好的函数,它接受了我的FormCollection(由控制器提供)。现在我想做一个模型绑定,让我的模型绑定器调用这个函数,它需要FormCollection。不知什么原因,我能找到它。我原以为会的 controllerContext.HttpContext.Request.Form尝试以下操作: var formCollection = new FormCollection(controllerContext.HttpContext.Request.Form) FormCollect
controllerContext.HttpContext.Request.Form
尝试以下操作:
var formCollection = new FormCollection(controllerContext.HttpContext.Request.Form)
FormCollection是我们添加到ASP.NET MVC中的一种类型,它有自己的ModelBinder。您可以查看FormCollectionBinderAttribute的代码来了解我的意思。使用bindingContext.ValueProvider(和bindingContext.ValueProvider.TryGetValue等)直接获取值。直接访问表单集合似乎是不受欢迎的。下面是一个来自MVC4项目的示例,其中我有一个定制的Razor EditorTemplate,它在单独的表单字段中捕获日期和时间。自定义绑定器检索各个字段的值,并将它们组合成一个
DateTime
public class DateTimeModelBinder : DefaultModelBinder
{
private static readonly string DATE = "Date";
private static readonly string TIME = "Time";
private static readonly string DATE_TIME_FORMAT = "dd/MM/yyyy HH:mm";
public DateTimeModelBinder() { }
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null) throw new ArgumentNullException("bindingContext");
var provider = new FormValueProvider(controllerContext);
var keys = provider.GetKeysFromPrefix(bindingContext.ModelName);
if (keys.Count == 2 && keys.ContainsKey(DATE) && keys.ContainsKey(TIME))
{
var date = provider.GetValue(string.Format("{0}.{1}", bindingContext.ModelName, DATE)).AttemptedValue;
var time = provider.GetValue(string.Format("{0}.{1}", bindingContext.ModelName, TIME)).AttemptedValue;
if (!string.IsNullOrWhiteSpace(date) && !string.IsNullOrWhiteSpace(time))
{
DateTime dt;
if (DateTime.TryParseExact(string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0} {1}", date, time),
DATE_TIME_FORMAT,
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.AssumeLocal,
out dt))
return dt;
}
}
return base.BindModel(controllerContext, bindingContext);
}
}