Asp .Net MVC при выполнении действия. Получите значение значений параметров действия для пользовательских типов при выполнении действия.

Я хочу регистрировать каждое имя параметра метода действия и его соответствующие значения в базе данных в виде пары ключ-значение. В рамках этого я использую OnActionExecuting ActionFilterAttribute, поскольку это будет правильное место (метод OnActionExecuting получит вызов для вызова всех методов действий контроллера) для получения контекста Action Executing.

Я получаю значение для типов .Net (string, int, bool). Но я не могу получить значение пользовательских типов (настраиваемых типов). (например, модель входа). В моей модели могут быть и другие вложенные пользовательские типы.

Я пытался получить значения пользовательских типов, но я получаю единственное имя класса в виде строки. Я надеюсь, что мы можем сделать в размышлении.

Не могли бы вы помочь кому-нибудь решить проблему. так как я новичок в размышлениях. Это будет полезно для меня. Заранее спасибо. Мне нужно получить имя и значение этих типов в OnActionExecuting.

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    ActionParameter = new SerializableDictionary<string,string>();

    if(filterContext.ActionParameter != null)
    {
        foreach(var paramter in filterContext.ActionParameter)
        {
            //able to get returnUrl value
            //unable to get model values

            ActionParameter.Add(paramter.Key, paramter.Value);
        }
    }

}

public ActionResult Login(LoginModel model, string returnUrl)
{
     return View(model);
}

Пользовательский тип

public class LoginModel
{
    public string  UserName {get;set;}

    public string  Password {get;set;}

    //User defined type

    public UserRequestBase Request {get;set;}

}   

//User defined type
public class UserRequestBase 
{
    public string  ApplicationName {get;set;}
}

Я могу получить значение returnUrl (параметр метода входа) в OnActionExecuting, но не для модели (параметр метода входа). Я могу видеть значения, но не знаю, как получить к ним доступ, я использовал typeof, хотя я не могу его получить, но мне нужен общий, потому что у меня есть 20 методов в контроллере, поэтому я мог не только для LoginModel.


person Prem    schedule 20.11.2014    source источник
comment
Возможно, вы захотите взглянуть на это: stackoverflow.com/questions/ 9758051/get-type-using-reflection   -  person wahwahwah    schedule 20.11.2014
comment
Как упоминается в ссылке, нам нужно предоставить Item в качестве ключа для getProperty, но здесь я не могу знать имя свойства в руке, поскольку оно может отличаться для каждого метода действия. factData.getType().getProperty(Item).PropertyType.Name;   -  person Prem    schedule 20.11.2014
comment
Пожалуйста, помогите в этом??   -  person Prem    schedule 21.11.2014


Ответы (1)


Этот ответ не совсем то, что вы хотите, исходя из вашего вопроса, но я думаю, что он лучше подойдет для того, чего вы хотите достичь. Быстро в сторону...

Игра с отражением и вложенными классами в этом случае привела к некоторым ошибкам SO (a propos?) для меня...

Так, может быть, лучший путь? Вместо того, чтобы пытаться получить/преобразовать имена свойств, значения (типы?) из 'context.ActionParameters', я обнаружил, что гораздо проще позволить сериализации Json сделать всю работу за меня. Затем вы можете сохранить объект Json, а затем десериализовать... довольно просто.

В любом случае, вот код:

using Newtonsoft.Json; // <-- or some other serialization entity
//...
 public class LogActions : ActionFilterAttribute, IActionFilter
    {

        // Using the example -- LoginModel, UserRequestBase objects and Login controller...

        void IActionFilter.OnActionExecuting(ActionExecutingContext context)
        {
            var param = (Dictionary<String, Object>)context.ActionParameters;

            foreach (var item in param.Values)
            {
                string itemName = item.GetType().Name.ToString();
                string itemToJson = JsonConvert.SerializeObject(item);


                // Save JsonObject along with whatever other values you need (route, etc)
            }
        }

    }

Затем, когда вы извлекаете объект Json из базы данных, вам просто нужно его десериализовать/привести.

LoginModel model = (LoginModel)JsonConvert.DeserializeObject(itemToJson, typeof(LoginModel));

Из примера:

public class LoginModel
{
    public string  UserName {get;set;}

    public string  Password {get;set;}

    //User defined type

    public UserRequestBase Request {get;set;}

}   

//User defined type
public class UserRequestBase 
{
    public string  ApplicationName {get;set;}
}

Контроллер, используемый в примере:

public ActionResult Login(LoginModel model, string returnUrl)
{
     return View(model);
}

Надеюсь это поможет. Если есть дополнительные проблемы с этим, пожалуйста, дайте мне знать, и я постараюсь помочь.

person wahwahwah    schedule 21.11.2014