C# 在ASP.NET MVC中发布后如何更改表单值?
我想在将表单值传递给控制器的操作之前更改表单值。但它抛出的C# 在ASP.NET MVC中发布后如何更改表单值?,c#,asp.net-mvc,post,action-filter,C#,Asp.net Mvc,Post,Action Filter,我想在将表单值传递给控制器的操作之前更改表单值。但它抛出的集合是只读的。 public class PersonController : Controller { public ActionResult Add() { return View(); } [HttpPost] [PersianDateConvertor("birthday")] public ActionResult Add(FormCollection colle
集合是只读的。
public class PersonController : Controller
{
public ActionResult Add()
{
return View();
}
[HttpPost]
[PersianDateConvertor("birthday")]
public ActionResult Add(FormCollection collection)
{
string firstName = collection["firstName"];
string lastName = collection["lastName"];
string birthday = collection["birthday"];
return View();
}
}
public class PersianDateConvertorAttribute : ActionFilterAttribute
{
string[] fields;
public PersianDateConvertorAttribute(params string[] persianDateFieldNames)
{
if (persianDateFieldNames == null)
fields = new string[] { };
else
fields = persianDateFieldNames;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
foreach (var field in fields)
{
string value = filterContext.HttpContext.Request.Form[field];
filterContext.HttpContext.Request.Form.Remove(field); //throws Collection is read-only
filterContext.HttpContext.Request.Form.Add(field, ConvertToGregorian(value));
// or filterContext.HttpContext.Request.Form[field] = ConvertToGregorian(value);
}
base.OnActionExecuting(filterContext);
}
}
如果我理解正确,您希望在绑定过程中修改
DateTime
的行为。我将使用ModelBinder来更改日期字符串的格式,而不是使用属性
在转换来自多个区域性的十进制值时,我针对一个问题做了类似的操作:(代码取自一篇博客文章,不是我的,但我不记得源代码。对不起)
在global.asax中注册活页夹
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
}
在我看来,这是一种更好的方法,您不必为每个操作添加属性,因为某些原因我不想在操作中转换数据请看这些问题:以及
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
}