模型绑定
众所周知,在 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
}
}
}