Asp.Net MVC 2 - Привязать свойство модели к другому именованному значению

Установите svn:ignore свойство родительского каталога:

svn propset svn:ignore dirname .

, Если у Вас есть несколько вещей проигнорировать, отделитесь новыми строками в значении свойства. В этом случае легче отредактировать значение свойства с помощью внешнего редактора:

svn propedit svn:ignore .
49
задан Community 23 May 2017 в 02:34
поделиться

1 ответ

Таким образом, я провел большую часть дня, пытаясь выяснить, почему я не мог заставить это работать. Так как я выполняю свои вызовы от System.Web.Http.ApiController, оказывается, что Вы не можете использовать DefaultPropertyBinder решение, как упомянуто выше, но вместо этого должны нас IModelBinder класс.

класс, что я волновал запись для замены основополагающей работы @AndreasZoltan, как записано выше, следующие:

using System.Reflection;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.ModelBinding;
using QueryStringAlias.Attributes;

namespace QueryStringAlias.ModelBinders
{
    public class AliasModelBinder : IModelBinder
    {
        private bool TryAdd(PropertyInfo pi, NameValueCollection nvc, string key, ref object model)
        {
            if (nvc[key] != null)
            {
                try
                {
                    pi.SetValue(model, Convert.ChangeType(nvc[key], pi.PropertyType));
                    return true;
                }
                catch (Exception e)
                {
                    Debug.WriteLine($"Skipped: {pi.Name}\nReason: {e.Message}");
                }
            }
            return false;
        }

        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            Type bt = bindingContext.ModelType;
            object model = Activator.CreateInstance(bt);
            string QueryBody = actionContext.Request.Content.ReadAsStringAsync().Result;
            NameValueCollection nvc = HttpUtility.ParseQueryString(QueryBody);

            foreach (PropertyInfo pi in bt.GetProperties())
            {
                if (TryAdd(pi, nvc, pi.Name, ref model))
                {
                    continue;
                };
                foreach (BindAliasAttribute cad in pi.GetCustomAttributes<BindAliasAttribute>())
                {
                    if (TryAdd(pi, nvc, cad.Alias, ref model))
                    {
                        break;
                    }
                }
            }
            bindingContext.Model = model;
            return true;
        }
    }
}

, Чтобы удостовериться, что это работает как часть вызова WebAPI, который необходимо также добавить config.BindParameter(typeof(TestModelType), new AliasModelBinder()); в части Regiser Вашего WebApiConfig.

при использовании этого метода также необходимо удалить [FromBody] из сигнатуры метода.

    [HttpPost]
    [Route("mytestendpoint")]
    [System.Web.Mvc.ValidateAntiForgeryToken]
    public async Task<MyApiCallResult> Signup(TestModelType tmt) // note that [FromBody] does not appear in the signature
    {
        // code happens here
    }

Примечание, которое эта работа основывается на ответе выше, с помощью эти QueryStringAlias образцы.

В данный момент это, вероятно, перестало бы работать в случае, где TestModelType имел сложные вложенные типы. Идеально существует несколько других вещей:

  • вложенные типы комплекса дескриптора надежно
  • позволяют атрибуту на классе активироваться, IModelBuilder в противоположность в регистрации
  • позволяют тому же IModelBuilder работать в обоих Контроллерах и ApiControllers

, Но на данный момент я удовлетворен этим для своих собственных потребностей. Надо надеяться, кто-то находит эту часть полезной.

1
ответ дан 7 November 2019 в 11:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: