繁体   English   中英

部分视图数据未保存在 ASP.NET Core MVC 中

[英]Partial view data doesn't get saved in ASP.NET Core MVC

我在项目类中创建类Project我定义技术和另一个我定义类Technology我在技术中播种数据,然后我在项目Create视图中使用部分视图创建下拉列表,当我保存数据时无法保存技术

public class Project
{
    public int ProjectId { get; set; }

    [StringLength(60, MinimumLength = 3)]
    public string? ProjectName { get; set; }

    public string? Description { get; set; }

    public DateTime Start { get; set; }
    public DateTime? End { get; set; }

    public string? ProjectHead { get; set; }
    public string? Status { get; set; }
    public string? Technology { get; set; }
}

public class Technology
{
    public int TechnologyId { get; set; }
    public string? TechnologyName { get; set; }
}

这是我的控制器:

public async Task<IActionResult> Create([Bind("ProjectId,ProjectName,Description,Start,End,ProjectHead,Status,Technology")] Project project)
{
        if (ModelState.IsValid)
        {
            _context.Add(project);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

        return View(project);
}

这是我对项目创建的看法:

<div class="row">
        <partial name="_Technologypartial" />
</div>

技术

@model TeamManagement.Models.Technology

<div class="row">
    <div class="form-group col-md-6">
        <label>Technology</label>
        <br />
        <select asp-for="TechnologyId" class="form-control" asp-items="@(new SelectList(ViewBag.Technology,"TechnologyId","TechnologyName"))">
        </select>
    </div>
</div>

在此处输入图像描述


编辑

看法

<div class="row">
        <partial name="_Technologypartial" model="@Model.technology" />
    </div>

控制器

 {
            var list = _context.Technology.ToList();

            List<SelectListItem> dropdown = new List<SelectListItem>();
            foreach (var item in list)
            {
                dropdown.Add(new SelectListItem()
                {
                    Text = item.TechnologyName,
                    Value = item.TechnologyId.ToString()
                });
            }

            PartialViewData model = new PartialViewData();
            ViewBag.Technology = dropdown;
            return View(model);
        }

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(PartialViewData model)
        {
            if (ModelState.IsValid)
            {
                Project project = new Project()
                {
                    ProjectId = model.project.ProjectId,
                    ProjectName = model.project.ProjectName,
                    Description = model.project.Description,
                    Start = model.project.Start,
                    End = model.project.End,
                    ProjectHead = model.project.ProjectHead,
                    Status = model.project.Status,
                    Technology = model.technology.TechnologyId.ToString()
                };
                _context.Add(project);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }

            return View(model);

        }

当您在部分视图中选择一个选项时,提交表单后,您要保存选项的值。 我建议你使用 ViewModel 来实现它。 参考这个简单的演示:

为了方便测试,我简化了您的课程。

public class Project
    {
        public string Name { get; set; }
        public string? Technology { get; set; }
    }

public class Technology
    {
        public int TechnologyId { get; set; }
        public string? TechnologyName { get; set; }
    }

创建一个视图模型来传递值。

public class PartialViewData
    {
        public PartialViewData()
        {
            project = new Project();
            technology = new Technology();  
        }
        public Project project { get; set; }
        public Technology technology { get; set; } 
    }

数据库上下文

 public class MvcMovieContext : DbContext
    {
        public MvcMovieContext(DbContextOptions<MvcMovieContext> options) : base(options)
        {

        }
        public DbSet<Technology> technology { get; set; }
    }

控制器

 public class HomeController : Controller
    {
        
        private readonly MvcMovieContext _context;

        public HomeController(MvcMovieContext context)
        {
           
            _context = context;
        }

        public IActionResult Index()
        {
            return View();
        }
public IActionResult Privacy()
        {
            var list =  _context.technology.ToList();
             
            List<SelectListItem> dropdown = new List<SelectListItem>();
            foreach(var item in list)
            {
                dropdown.Add(new SelectListItem()
                {
                   Text = item.TechnologyName,
                   Value = item.TechnologyId.ToString()
                }) ;
            }

            PartialViewData model = new PartialViewData();
            ViewBag.Technology = dropdown;
            return View(model);
        }



[HttpPost]
public IActionResult Privacy(PartialViewData model)
{
     Project project = new Project()
          {
              Name = model.project.Name,
              Technology = model.technology.TechnologyId.ToString()
          };
    
                //......
    
     return View();
}
}

看法

@model PartialViewData

<form method="post">
    <input asp-for="@Model.project.Name" />

    <div class="row">
        <partial name="_Technologypartial" model="@Model.technology" />
    </div>
    <button type="submit">submit</button>
</form>

_技术部分

@model Technology

<div class="row">
    <div class="form-group col-md-6">
        <label>Technology</label>
        <br />
        <select name="technology.TechnologyId" class="form-control" asp-items=@ViewBag.Technology>
        </select>
    </div>
</div>

演示:

在此处输入图像描述

编辑=================

public IActionResult Create()
{
     var list =  _context.technology.ToList();

        List<SelectListItem> dropdown = new List<SelectListItem>();
        foreach(var item in list)
        {
            dropdown.Add(new SelectListItem()
            {
               Text = item.TechnologyName,
               Value = item.TechnologyId.ToString()
            }) ;
        }

        PartialViewData model = new PartialViewData();
        ViewBag.Technology = dropdown;
        return View(model);
}
    

    
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(PartialViewData model)
    {
        if (ModelState.IsValid)
        {
            //change here
            var name = _context.Technology.Where(x => x.TechnologyId == model.technology.TechnologyId).Select(x => x.TechnologyName).FirstOrDefault();
            Project project = new Project()
            {
                ProjectId = model.project.ProjectId,
                ProjectName = model.project.ProjectName,
                Description = model.project.Description,
                Start = model.project.Start,
                End = model.project.End,
                ProjectHead = model.project.ProjectHead,
                Status = model.project.Status,

                //change here
                Technology = name
            };
            _context.Add(project);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }

         return View(model);
        
    }

看法

@model PartialViewData



    <div class="row">
        <partial name="_Technologypartial" model="@Model.technology" />
    </div>

_技术部分

@model Technology

<div class="row">
    <div class="form-group col-md-6">
        <label>Technology</label>
        <br />
        <select name="technology.TechnologyId" class="form-control" asp-items=@ViewBag.Technology>
        </select>
    </div>
</div>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM