剃须刀页面,如何将 json 序列化字符串传递给模型属性

Posted

技术标签:

【中文标题】剃须刀页面,如何将 json 序列化字符串传递给模型属性【英文标题】:razor pages, how to passing json serialized string into model property 【发布时间】:2020-03-27 09:13:04 【问题描述】:

我有一个字符串属性以 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。所以我无法保存。

【问题讨论】:

你能在其构造函数中定义一个默认值 吗? 我的阅读没有问题,只有保存。模型的初始值可以是:NameProp="Peter", JsonCover = ""Loop":true,"FreeMode":true" 【参考方案1】:

您可以使用自定义模型绑定器。根据您的要求,您可以创建属性绑定器,如:

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 序列化字符串传递给模型属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将模型传递给剃须刀页面自定义助手

TS1127:将 Guid 传递给 js 方法时,剃须刀页面上的字符无效

无法在 Razor 页面中调用 onPost

如何利用jQuery post传递含特殊字符的数据

如何将反序列化JSON中的列表传递给视图到选择列表

如何将动态对象序列化为 dotnet core 中的 JSON 字符串?