asp.net mvc - Get custom attribute for parameter when model binding -
i've seen lot of similar posts on this, haven't found answer specific controller parameters.
i've written custom attribute called aliasattribute allows me define aliases parameters during model binding. example if have: public jsonresult emailcheck(string email) on server , want email parameter bound fields named primaryemail or somecrazyemail can "map" using aliasattribute this: public jsonresult emailcheck([alias(suffix = "email")]string email).
the problem: in custom model binder can't hold of aliasattribute class applied email parameter. returns null. i've seen defaultmodelbinder class doing bindattribute in reflector , same doesn't work me.
question: how attribute during binding?
aliasmodelbinder:
public class aliasmodelbinder : defaultmodelbinder { public static icustomtypedescriptor gettypedescriptor(type type) { return new associatedmetadatatypetypedescriptionprovider(type).gettypedescriptor(type); } public override object bindmodel(controllercontext controllercontext, modelbindingcontext bindingcontext) { var value = base.bindmodel(controllercontext, bindingcontext); var descriptor = gettypedescriptor(bindingcontext.modeltype); /*************************/ // next statement returns null! /*************************/ aliasattribute attr = (aliasattribute)descriptor.getattributes()[typeof(aliasattribute)]; if (attr == null) return null; httprequestbase request = controllercontext.httpcontext.request; foreach (var key in request.form.allkeys) { if (string.isnullorempty(attr.prefix) == false) { if (key.startswith(attr.prefix, stringcomparison.invariantcultureignorecase)) { if (string.isnullorempty(attr.suffix) == false) { if (key.endswith(attr.suffix, stringcomparison.invariantcultureignorecase)) { return request.form.get(key); } } return request.form.get(key); } } else if (string.isnullorempty(attr.suffix) == false) { if (key.endswith(attr.suffix, stringcomparison.invariantcultureignorecase)) { return request.form.get(key); } } if (attr.hasincludes) { foreach (var include in attr.inlcludesplit) { if (key.equals(include, stringcomparison.invariantcultureignorecase)) { return request.form.get(include); } } } } return null; } } aliasattribute:
[attributeusage(attributetargets.parameter | attributetargets.class, allowmultiple = false, inherited = true)] public class aliasattribute : attribute { private string _include; private string[] _inlcludesplit = new string[0]; public string prefix { get; set; } public string suffix { get; set; } public string include { { return _include; } set { _include = value; _inlcludesplit = splitstring(_include); } } public string[] inlcludesplit { { return _inlcludesplit; } } public bool hasincludes { { return inlcludesplit.length > 0; } } internal static string[] splitstring(string original) { if (string.isnullorempty(original)) { return new string[0]; } return (from piece in original.split(new char[] { ',' }) let trimmed = piece.trim() !string.isnullorempty(trimmed) select trimmed).toarray<string>(); } } usage:
public jsonresult emailcheck([modelbinder(typeof(aliasmodelbinder)), alias(suffix = "email")]string email) { // email assigned field suffixed "email". e.g. primaryemail, secondaryemail , on }
gave on , stumbled across action parameter alias code base allow me this. it's not flexible started out write can modified allow wild cards.
Comments
Post a Comment