首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定属性为空。

绑定属性为空。
EN

Stack Overflow用户
提问于 2019-01-17 12:43:01
回答 1查看 489关注 0票数 2

我是新来的,我想弄清楚发生了什么,并认为这是最好的地方问。那么,当我选择这个项目并按下add按钮时,属性绑定“”Model来了空,但为什么呢?

这是我的观点:

代码语言:javascript
复制
@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>

变量PortfolioVM对于任何数据都是空的。这是我的控制器和我的视图模型

代码语言:javascript
复制
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");
}

这是另一种模型和细节方法:

代码语言:javascript
复制
 // 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; }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 22:47:39

绑定到属性

首先,您在ViewModels中定义了字段。它们可以在视图中读取,但是要使模型绑定工作,需要使用get和set访问器将它们声明为Properties

代码语言:javascript
复制
public class PortfolioDetailsVM
{
    //...

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

这将使您的绑定代码工作。

更好的绑定模型

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

相反,我通常只在绑定到的模型中声明我真正需要的内容,这样我就不必首先使用ol‘Bind属性了。这是一个简单的例子:

代码语言:javascript
复制
public class DetailsAddProjectVM
{
    public string SelectedProjectId { get; set; }
}

并附上相应的表格:

代码语言:javascript
复制
@model PortfolioDetailsVM
<select asp-for="SelectedProjectId" class="custom-select form-control">
   ...
</select>

哪一个职位

代码语言:javascript
复制
public async Task<IActionResult> AddProject(DetailsAddProjectVM bindingModel)
{
   //look ma, no [Bind]!
   var projectid = bindingModel.SelectedProjectId;
}

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

正如您所看到的,您根本没有可以绑定到原始视图模型的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54236229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档