c# - 绑定(bind)属性变为空

标签 c# asp.net-core asp.net-core-mvc

我是这方面的新手,正在尝试弄清楚发生了什么,并认为这是最好的询问地点。好吧,当我选择项目并按下添加按钮时,属性 [Bind""]Model 变为空,但为什么呢?

这是我的观点:

@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 的任何数据都为空。 这是我的 Controller 和我的 View 模型:

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; }
    }
}

最佳答案

绑定(bind)到属性

首先,您已经在 ViewModel 中定义了字段。它们可以在您的 View 中读取,但要使模型绑定(bind)起作用,您需要将它们声明为 Properties,并使用 get 和 set 访问器:

public class PortfolioDetailsVM
{
    //...

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

这应该可以使您的绑定(bind)代码正常工作。

更好的绑定(bind)模型

其次,您以稍微不正确的方式使用模型绑定(bind)。尽量不要直接绑定(bind)到您的数据模型(例如 PortfolioProject 的类型)。您要绑定(bind)的模型不应包含对数据模型类型的任何引用。

相反,我通常只在绑定(bind)到的模型中声明我真正需要的东西,这样我就不必一开始就使用那个旧的 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;
}

当然,要呈现相应的表单,您还必须在原始 PortfolioDetailsVM 中声明一个 SelectedProjectId 属性。

如您所见,您根本不必绑定(bind)到您的原始 View 模型。

关于c# - 绑定(bind)属性变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54236229/

相关文章:

c# - 使用 Linq to XML 和数组创建 XML

c# - 在 JSQMessagesViewController 中显示 LocationMediaItem

c# - 如何为线程创建实用方法

asp.net-core - 不能将 'Microsoft.AspNet.OData.Routing.ODataRoute' 与端点路由一起使用。 ASP Net Core 2.2 的异常

c# - 如何解释 ASP.NET Core 2.1 中的 Serilog 配置?

asp.net-core - asp.net Core Identity 中的 Multiple & SubDomain cookie

c# - ASP.NET Core 2.1 不引人注目的 Ajax 验证不适用于部分 View 表单交换

c# - new Action() 和 lambda 有什么区别?

java - SignalR Core Android 客户端,JWT 身份验证返回 NULL

angular - 我可以使用 IdentityServer4 spa JS UI 而不是 asp .net core mvc 吗?