public class FormValueRequiredAttribute : ActionMethodSelectorAttribute
{
private readonly string[] _submitButtonNames;
private readonly FormValueRequirement _requirement;
public FormValueRequiredAttribute(params string[] submitButtonNames):
this(FormValueRequirement.Equal, submitButtonNames)
{
}
public FormValueRequiredAttribute(FormValueRequirement requirement, params string[] submitButtonNames)
{
//at least one submit button should be found
this._submitButtonNames = submitButtonNames;
this._requirement = requirement;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
foreach (string buttonName in _submitButtonNames)
{
try
{
string value = "";
switch (this._requirement)
{
case FormValueRequirement.Equal:
{
//do not iterate because "Invalid request" exception can be thrown
value = controllerContext.HttpContext.Request.Form[buttonName];
}
break;
case FormValueRequirement.StartsWith:
{
foreach (var formValue in controllerContext.HttpContext.Request.Form.AllKeys)
{
if (formValue.StartsWith(buttonName, StringComparison.InvariantCultureIgnoreCase))
{
value = controllerContext.HttpContext.Request.Form[formValue];
break;
}
}
}
break;
}
if (!String.IsNullOrEmpty(value))
return true;
}
catch (Exception exc)
{
//try-catch to ensure that
Debug.WriteLine(exc.Message);
}
}
return false;
}
}
public enum FormValueRequirement
{
Equal,
StartsWith
}
public class FormValueExistsAttribute : FilterAttribute, IActionFilter
{
private readonly string _name;
private readonly string _value;
private readonly string _actionParameterName;
public FormValueExistsAttribute(string name, string value, string actionParameterName)
{
_name = name;
_value = value;
_actionParameterName = actionParameterName;
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var formValue = filterContext.RequestContext.HttpContext.Request.Form[_name];
filterContext.ActionParameters[_actionParameterName] = !string.IsNullOrEmpty(formValue) &&
formValue.ToLower().Equals(_value.ToLower());
}
}