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());

}