Собственное свойство в Entity Framework Core 2.1 возвращает значение NULL в HttpPost Редактировать ActionResult в MVC Core Application - PullRequest
0 голосов
/ 12 июня 2019

У меня есть объект модели с собственностью. Это привязка к моей начальной странице редактирования, но возвращается как ноль при обратной передаче. Я использую Entity Framework Core 2.1 в приложении Asp.Net MvcCore.

Я пробовал методы, которые я успешно использую для других свойств. Я попытался установить его как скрытый, просто чтобы увидеть, если он совершает туда-обратно без редактирования. Я попытался присвоить полю атрибут [BindProperty].

-----Portion of Model using Owned Property----------   
public class Samurai
{
    public int Id { get; set; }
    public string Name { get; set; }

    [Display(Name = "Better Name")]
    [BindProperty]
    public PersonFullName BetterName { get; set; }
...

----------Portion of Owned Property Class----------
public class PersonFullName
{
    public static PersonFullName Create(string givenName, string surName)
    {
        return new PersonFullName(givenName, surName);
    }

    private PersonFullName(string givenName, string surName)
    {
        SurName = surName;
        GivenName = givenName;
    }

               ...

    private PersonFullName() { }

    public string SurName { get; private set; }
    public string GivenName { get; private set; }
    public string FullName => $"{GivenName} {SurName}";
    public string FullNameReverse => $"{SurName}, {GivenName}";
               ...

----------------portion of edit.cshtml----------------
<div class="row">
<div class="col-md-4">
    <form asp-action="Edit">
        <div asp-validation-summary="ModelOnly" class="text-danger"> 
</div>
        <input type="hidden" asp-for="Id" />
        <input type="hidden" asp-for="BetterName" />   
        <div class="form-group">
            <label asp-for="Name" class="control-label"></label>
            <input asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="BetterName.FullName" class="control-label"> 
            </label>
            <input asp-for="BetterName.FullName" class="form-control" />
            <span asp-validation-for="BetterName.FullName" 
            class="text-danger"></span>
        </div>

        <div class="form-group">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </form>
</div>
</div>

---------------Portion of Controller--------------
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, Samurai samurai)
    {
        if (id != samurai.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            { ...

Я ожидаю, что параметр samurai в контроллере будет иметь значение в свойстве samurai.BetterName, но оно всегда равно нулю. В представлении «Правка» значение BetterName отображается правильно, но оно теряется при обратной передаче.

Класс PersonFullName имеет свои установщики, установленные как private, поэтому он не может быть обновлен, но должен быть заменен (чтобы сделать его неизменным). Он должен использовать свою публичную функцию Create, чтобы установить значения. Я чувствую, что это может быть проблемой, но я хотел бы знать, как заставить это работать без изменения архитектуры самого класса.

...