2011-08-19 70 views
2

我想在将其传递给控制器​​的操作之前更改表单值。但它抛出Collection is read-only.如何在ASP.NET MVC中发布后更改表单值?

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); 
    } 
} 
+0

由于某些原因,我不想转换d ata我的行动 – Jalal

+0

看看这些SO问题:http://stackoverflow.com/questions/323265/c-can-i-modify-request-forms-variables和http://stackoverflow.com/questions/5561207 /请求形式的信息收集是只-只读-时,试图对设置文本框内容 – Baz1nga

回答

4

如果我理解正确的话,你要结合过程中修改DateTime的行为。我将使用ModelBinder来更改日期字符串的格式,而不是使用属性。

我做了一个问题,类似的东西,而从多元文化转换十进制值:(代码是从博客文章拍摄,这不是我的,但我不记得源对不起。)

using System; 
using System.Globalization; 
using System.Web.Mvc; 

public class DecimalModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
    ModelState modelState = new ModelState { Value = valueResult }; 
    object actualValue = null; 
    try 
    { 
     actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture); 
    } 
    catch (FormatException e) 
    { 
     modelState.Errors.Add(e); 
    } 
    bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
    return actualValue; 
    } 
} 

在Global.asax中注册该粘结剂

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 

} 

伊莫这是一个更好的方法,你不必把一个属性,每一个动作

相关问题