![](/img/trans.png)
[英]how to post values to certain url using razor form in asp.net mvc 5
[英]How to change form values after post in ASP.NET MVC?
我想在将表单值传递给控制器的操作之前对其进行更改。 但是它抛出Collection is read-only.
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更改日期字符串的格式。
在转换来自多种区域性的十进制值时,我做了类似的事情:(代码取自博客文章,它不是我的,但我不记得源代码了。抱歉)
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());
}
即时通讯,这是一种更好的方法,您不必为每个操作都添加属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.