Свойство связывания становится пустым - PullRequest
0 голосов
/ 17 января 2019

Я новичок в этом и пытаюсь выяснить, что происходит, и думаю, что это лучшее место, чтобы спросить. Хорошо, когда я выбираю проект и нажимаю кнопку добавления, свойство [Bind ""] Модель обнуляется, но почему?

Это мой взгляд:

@model PortfolioDetailsVM
<form asp-controller="Portfolio" asp-action="AddProject" method="POST">
    <div class="form-group">
        <div class="input-group mb-3">
            <select asp-for="PortfolioProjects.ProjectId" class="custom-select form-control">
                <option disabled selected value="@null">Choose...</option>
                @foreach (var item in Model.Projects)
                {
                    <option value="@item.ProjectID">@item.Title</option>
                }
            </select>

Var PortfolioVM не имеет никаких данных. А это мой контроллер и моя модель взгляда:

namespace PEG.Models
{
    public class PortfolioDetailsVM
    {
        public PortfolioDetailsVM()
        {
            Portfolios = new Portfolio();
            PortfolioProjects = new PortfolioProject();
        }
        public Portfolio Portfolio;
        public PortfolioProject PortfolioProjects;
        public IEnumerable<Project> Projects;
    }
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> AddProject([Bind("PortfolioProject")]PortfolioDetailsVM PortfolioVM) //<----Null
{
    var addproject = PortfolioVM.PortfolioProjects;

    if (ModelState.IsValid)
    {
        try
        {
            context.Update(addproject);
            await context.SaveChangesAsync();
            return RedirectToAction("Details", "Portfolio" + PortfolioVM.PortfolioProjects.PortfolioId);
        }
        catch (DbUpdateException)
        {
            ModelState.AddModelError("", "Unable to save changes. " +
            "Try again, and if the problem persists, " +
            "see your system administrator.");
        }

    }

    return RedirectToAction("Index", "Portfolio");
}

Это другая модель и метод детали:

 // GET: Portfolio/Details/5
    public async Task<ActionResult> Details(int id)
    {
        PortfolioDetailsVM PortfolioVM = new PortfolioDetailsVM
        {
            Projects = await context.Project.Include(x => x.Task).ToListAsync(),
            Portfolios = await context.Portfolio.SingleOrDefaultAsync(x => x.PortfolioID == id)
        };

        return View(PortfolioVM);
    }
namespace PEG.Models
{
    public partial class PortfolioProject
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        [Column(TypeName = "datetime2")]
        public DateTime? CreatedDate { get; set; }

        //RelationsId
        [Key]
        [Column(Order = 0)]
        public int PortfolioId { get; set; }

        [Key]
        [Column(Order = 1)]
        public string ProjectId { get; set; }

        //Relations
        [ForeignKey("PortfolioId")]
        public virtual Portfolio Portfolio { get; set; }

        [ForeignKey("ProjectId")]
        public virtual Project Project { get; set; }
    }
}

1 Ответ

0 голосов
/ 18 января 2019

Привязать к свойствам

Во-первых, вы определили поля в ваших ViewModels. Их можно читать в вашем представлении, но для работы привязки модели необходимо объявить их как Свойства с аксессором get и set:

public class PortfolioDetailsVM
{
    //...

    public Portfolio Portfolio { get; set; }
    public PortfolioProject PortfolioProject { get; set; }
    public IEnumerable<Project> Projects { get; set; }
}

Это должно заставить ваш код привязки работать.

Лучшие модели переплета

Во-вторых, вы используете привязку модели немного некорректно. Старайтесь не связываться напрямую с вашими моделями данных (например, типом PortfolioProject). Модель, к которой вы привязываетесь, не должна содержать ссылок на типы моделей данных.

Вместо этого я обычно объявляю только то, что мне действительно нужно в модели, к которой я привязан, чтобы мне никогда не приходилось использовать этот атрибут ol 'Bind. Простой пример для вашего случая:

public class DetailsAddProjectVM
{
    public string SelectedProjectId { get; set; }
}

с соответствующей формой:

@model PortfolioDetailsVM
<select asp-for="SelectedProjectId" class="custom-select form-control">
   ...
</select>

какие сообщения

public async Task<IActionResult> AddProject(DetailsAddProjectVM bindingModel)
{
   //look ma, no [Bind]!
   var projectid = bindingModel.SelectedProjectId;
}

Конечно, для отображения соответствующей формы вам также необходимо объявить свойство SelectedProjectId в исходном PortfolioDetailsVM.

Как видите, у вас нет для привязки к вашей исходной модели просмотра вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...