Я знаю, что это противоречит философии команды c #, но я думаю, что поля чисты в классах poco. Похоже, менее подвижные части для меня. Во всяком случае,
Вот модель подшивки, которая будет загружать поля. Это довольно тривиально. Обратите внимание, что вы можете использовать новый объект с Activator.CreateInsance
или начать с существующего объекта в качестве отправной точки. Я использовал Да / Нет раскрывающихся списков для bool, у вас могут быть флажки, и в этом случае, к сожалению, вам придется циклически просматривать fieldinfos и искать пропущенные входные данные формы. B / c html не отправляет элементы формы, если установлен флажок false.
~ / Binders / FieldModelBinder.cs
using System;
using System.Reflection;
using System.Web.Mvc;
namespace MyGreatWebsite.Binders
{
public class FieldModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var obj = controllerContext.HttpContext.Session["CurrentObject"];// Activator.CreateInstance(bindingContext.ModelType);
var form = controllerContext.HttpContext.Request.Form;
foreach (string input in form)
{
FieldInfo fieldInfo = obj.GetType().GetField(input);
if (fieldInfo == null)
continue;
else if (fieldInfo.FieldType == typeof(bool))
fieldInfo.SetValue(obj, form[input] == "Yes");
else
fieldInfo.SetValue(obj, Convert.ChangeType(form[input], fieldInfo.FieldType));
}
return obj;
}
}
}
Startup.cs
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
ModelBinders.Binders.Add(typeof(FieldModelBinder), new FieldModelBinder());
}
}
Использование
[HttpPost]
public ActionResult MyGreatAction([ModelBinder(typeof(FieldModelBinder))] MyGreatProject.MyGreatNamespace.MyGreatType instance, string myGreatParameters)
{
DoSomethingGreatWithMyInstance();
return View();
}