模型绑定


  众所周知,在 Asp.Net MVC 里使用 Ajax Post 复杂的数据到 Action 是比较麻烦的,因此,Fireasy 提供了以 Json 为数据载体的模型绑定。它是通过重写 ControllerActionInvoker 类的 GetParameterValue 方法来实现的。使用上一章的 控制器依赖注入 后,该部件就被自动替换掉了,因此在使用的时候需要特别注意,它不再适用于原生的 Form Post 方式,取而代之的是使用 Ajax Post。如下所示:

<script type="text/jsavascript">
  var data = {};
  data.userId = 45;
  data.userName = "fireasy";
  data.permissions = [ { "roleId", 1, "allow": true }, { "roleId", 2, "allow": true } ];
  $.post('/home/SavePermission', { "model": data }, function (result) {
    alert(result.succeed);
  });
</script>

  Controller 的 SavePermission 如下所示:

public class HomeController : Controller
{
    [HttpPost]
    public ActionResult SavePermission(PermissionModel model)
    {
        return Json(Result.Succeed("保存成功"));
    }
}

// Models
public class PermissionModel
{
    public int UserId { get; set; }
    
    public string UserName { get; set; }
    
    public List<PermissionModel> Permissions { get; set; }
}

public class PermissionModel
{
    public int RoleId { get; set; }
    
    public bool Allow { get; set; }
}

  如果你直接接收一个 实体类型,配置 Json 转换器 LightEntityJsonConverter 后,可以识别出前端所赋值的属性,它可以直接 插入更新 到数据库。你需要在 Global 里添加如下的 Json 转换器:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        //使用 LightEntity 反序列化转换器
        GlobalSetting.Converters.Add(new LightEntityJsonConverter());
    }
}

  在 Asp.Net Core MVC 中你也可以采用这种模型绑定。你需要在 Startup.ConfigureServices 方法里使用 ConfigureFireasyMvc 方法,由 UseJsonModelBinder 来切换启用或禁用:

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy(Configuration).AddIoc();
#if NETCOREAPP3_1
            services.AddControllersWithViews()
                .ConfigureFireasyMvc(options =>
                {
                    options.UseJsonModelBinder = true; //默认是开启的
                    options.JsonSerializeOption.Converters.Add(new LightEntityJsonConverter());
                });
#else
            services.AddMvc()
                .ConfigureFireasyMvc(options =>
                {
                    options.UseJsonModelBinder = true; //默认是开启的
                    options.JsonSerializeOption.Converters.Add(new LightEntityJsonConverter());
                });
#endif
        }
    }
}