razor 页面,如何将 json 序列化字符串传递到模型 属性
razor pages, how to passing json serialized string into model property
我有一个模型,其中字符串 属性 以 json 格式序列化,但我无法保存:
public class Foo
{
public string NameProp;
public string JsonCover;
}
public class Cover
{
public bool Loop;
public bool FreeMode;
}
JsonCover 字符串是这样的:
{"Loop":true,"FreeMode":true}
查看 cshtml:
@model MyLocalPath.Models.Foo
@using Newtonsoft.Json
@{Cover cover = JsonConvert.DeserializeObject<Cover>(Model.JsonCover); }
<div class="row">
<div class="col-md-4">
<form method="post">
<div class="form-group">
<label asp-for="@Model.nameProp" class="control-label"></label>
<input asp-for="@Model.nameProp" class="form-control" />
<span asp-validation-for="@Model.nameProp"></span>
</div>
<div class="form-group">
<label asp-for="@cover.Loop" class="control-label"></label>
<input asp-for="@cover.Loop" class="form-control" />
<span asp-validation-for="@cover.Loop"></span>
</div>
<div class="form-group">
<label asp-for="@cover.FreeMode" class="control-label"></label>
<input asp-for="@cover.FreeMode" class="form-control" />
<span asp-validation-for="@cover.FreeMode"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" name="save" />
</div>
</form>
</div>
</div>
我的问题是在 HttpPost IActionResult 中:Foo.JsonCover 为 NULL。所以无法保存。
您可以使用自定义模型活页夹。根据您的要求,您可以创建 属性 活页夹,例如:
public class CustomModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var loop = bindingContext.HttpContext.Request.Form["cover.loop"][0];
var freeMode = bindingContext.HttpContext.Request.Form["cover.freemode"][0];
Cover cover = new Cover() {Loop=Convert.ToBoolean(loop),FreeMode= Convert.ToBoolean(freeMode) };
var result= JsonConvert.SerializeObject(cover);
bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
}
并应用于您的模型:
public class Foo
{
public string nameProp { get; set; }
[BindProperty(BinderType = typeof(CustomModelBinder))]
public string JsonCover { get; set; }
}
服务器端函数:
public IActionResult actionName(Foo myViewModel)
{
...
}
我有一个模型,其中字符串 属性 以 json 格式序列化,但我无法保存:
public class Foo
{
public string NameProp;
public string JsonCover;
}
public class Cover
{
public bool Loop;
public bool FreeMode;
}
JsonCover 字符串是这样的:
{"Loop":true,"FreeMode":true}
查看 cshtml:
@model MyLocalPath.Models.Foo
@using Newtonsoft.Json
@{Cover cover = JsonConvert.DeserializeObject<Cover>(Model.JsonCover); }
<div class="row">
<div class="col-md-4">
<form method="post">
<div class="form-group">
<label asp-for="@Model.nameProp" class="control-label"></label>
<input asp-for="@Model.nameProp" class="form-control" />
<span asp-validation-for="@Model.nameProp"></span>
</div>
<div class="form-group">
<label asp-for="@cover.Loop" class="control-label"></label>
<input asp-for="@cover.Loop" class="form-control" />
<span asp-validation-for="@cover.Loop"></span>
</div>
<div class="form-group">
<label asp-for="@cover.FreeMode" class="control-label"></label>
<input asp-for="@cover.FreeMode" class="form-control" />
<span asp-validation-for="@cover.FreeMode"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" name="save" />
</div>
</form>
</div>
</div>
我的问题是在 HttpPost IActionResult 中:Foo.JsonCover 为 NULL。所以无法保存。
您可以使用自定义模型活页夹。根据您的要求,您可以创建 属性 活页夹,例如:
public class CustomModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var loop = bindingContext.HttpContext.Request.Form["cover.loop"][0];
var freeMode = bindingContext.HttpContext.Request.Form["cover.freemode"][0];
Cover cover = new Cover() {Loop=Convert.ToBoolean(loop),FreeMode= Convert.ToBoolean(freeMode) };
var result= JsonConvert.SerializeObject(cover);
bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
}
并应用于您的模型:
public class Foo
{
public string nameProp { get; set; }
[BindProperty(BinderType = typeof(CustomModelBinder))]
public string JsonCover { get; set; }
}
服务器端函数:
public IActionResult actionName(Foo myViewModel)
{
...
}