страницы razor, как передать сериализованную строку json в свойство модели

У меня есть модель со строковым свойством, сериализованным в формате 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. Так что я не могу сэкономить.


person Xtian11    schedule 02.12.2019    source источник
comment
вы можете определить значение по умолчанию {} в его конструкторе?   -  person Jawad    schedule 02.12.2019
comment
С чтением проблем нет, только с сохранением. Начальное значение для модели может быть: NameProp = Peter, JsonCover = {Loop: true, FreeMode: true}.   -  person Xtian11    schedule 02.12.2019


Ответы (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)
{
   ...
}
person Nan Yu    schedule 03.12.2019