使用 ID 参数重定向到操作 - .Net Core Web App MVC

Posted

技术标签:

【中文标题】使用 ID 参数重定向到操作 - .Net Core Web App MVC【英文标题】:Redirect To Action with ID Parameter - .NetCore Web App MVC 【发布时间】:2021-12-09 11:17:57 【问题描述】:

在尝试重定向到视图时需要一些帮助。

我有一个名为 Jobs/Index 的视图/操作 简而言之,这个视图抓取了一个员工列表,我为每个员工添加了一个按钮,供他们点击,以便他们查看分配给他们的工作。每个按钮执行Jobs/EmployeeJobs/Id,ID取决于他们的员工ID。

我有一个视图/操作,即 jobs/EmployeeJobs/2。 此视图显示分配给该员工的所有工作的列表,ID 为 2,但显然会根据员工而改变。

所以,在那个页面上,我有我的 EDIT、DETAILS 和 DELETE 按钮。他们都工作正常。 但是,当我尝试编辑一些工作信息并单击保存时。我的 URL 将我定向到 https://localhost:44327/Jobs。

当用户点击保存时,我希望被重定向回该员工的视图,例如 https://localhost:44327/Jobs/EmployeeJobs/2。

这是我的工作控制器中的 EmployeeJobs/2 操作

     `public async Task<IActionResult> EmployeeJobs(int? id)
    
                    var jobs = await _context.Jobs
       .Include(j => j.Clients)
       .Include(j => j.Employees)
       .Include(j => j.Stage1)
       .Include(j => j.Stage2)
       .Include(j => j.Substages)
       .Include(j => j.Substages2).Where(m => m.Employees.Id == id)
                   .ToListAsync();


        return View(jobs);

    `

这是我的 Jobs Controller 或 (POST) 中的 Edit/5 Action

        [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, [Bind("Id,JobNumber,Address,ClientID,StaffId,Notes,Stage1Id,Stage2Id,SubstagesId,Substages2Id,ConceptRequired,ConceptScheduleDate,ConceptSent,RevisionReceived,RevisionCompleted,ConceptApproved,MarketingRequired,MarketingScheduleDate,MarketingSent,MarketingCompleted,RenderRequired,RendererId,RenderSent,RenderReceived,ResourceRequired,PlannerId,ResourceScheduleDate,ResourceSent,ResourceCommentsReceived,ResourceCommentsCompeted,ResourceApproved,WorkingScheduleDate,WorkingCompleted,ReviewCompleted,TrussRequired,TrussId,TrussSent,TrussReceived,EngineerRequired,EngineerId,EngineerSent,EngineerReceived,ClientApprovalSent,ClientApprovalReceived,CouncilSubmission,CouncilId,BCNumber,RFIReceived,RFICompleted,BCGranted,AmendmentRequired,AmendmentScheduleDate,AmendmentCompleted,JobCompleted")] Jobs jobs)
    
        if (id != jobs.Id)
        
            return NotFound();
        

        if (ModelState.IsValid)
        
            try
            
                _context.Update(jobs);
                await _context.SaveChangesAsync();
            
            catch (DbUpdateConcurrencyException)
            
                if (!JobsExists(jobs.Id))
                
                    return NotFound();
                
                else
                
                    throw;
                
            

            return RedirectToAction("EmployeeJobs", new  id = id );
           //return RedirectToAction("EmployeeJobs", new RouteValueDictionary(
            //    new  controller = "Jobs", action = "EmployeeJobs", id = id ));

        

        return View(jobs);
    

如您所见,我多次尝试了两种方法或 RedirectToAction。奇怪的是,如果我的代码是 return RedirectToAction("EmployeeJobs", new id = 2 );

此代码会将我带回到 ID 为 2 的员工。 所以希望有人可以帮助我,请放轻松我对编码还很陌生

这是我的工作模型中的相关信息

    public class Jobs

    public int Id  get; set; 

    [Display(Name = "Job Number")]
    [Required]
    public int JobNumber  get; set; 

    public string Address  get; set; 

    // FK
    [Display(Name = "Client")]
    [ForeignKey("Clients")]
    public int ClientID  get; set; 

    // FK
    [Display(Name = "Employee")]
    [ForeignKey("Employees")]
    public int StaffId  get; set; 


    public string Notes  get; set; 

    public virtual Clients Clients  get; set; 
    public virtual Employees Employees  get; set; 




这是我的员工模型中的代码

public class Employees

    public int Id  get; set; 

    [Display(Name = "First Name")]
    [RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$")]
    [StringLength(20, MinimumLength = 3)]
    [Required]
    public string FirstName  get; set; 

    [Display(Name = "Last Name")]
    [RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$")]
    [StringLength(20, MinimumLength = 3)]
    [Required]
    public string LastName  get; set; 

    [Display(Name = "Contact Number")]
    [StringLength(15, MinimumLength = 8)]
    [Required]
    public string ContactNumber  get; set; 

    [StringLength(80, MinimumLength = 3)]
    [Required]
    public string Email  get; set; 

【问题讨论】:

【参考方案1】:

当您查询数据库时,我认为您的索引操作有错误。

这就是它无法返回新视图的原因。您将employeeIdjobId 混合在一起。对于 id=2 ,您有一个 Id =2 的员工,那么为什么它只为 id=2 工作;

而且您的索引操作有一个非常混乱的查询,而且它不是异步的。

试试这个

var jobs = await _context.Jobs
       .Include(j => j.Clients)
       .Include(j => j.Employees)
       .Include(j => j.Stage1)
       .Include(j => j.Stage2)
       .Include(j => j.Substages)
       .Include(j => j.Substages2)
       .Where(m =>  m.Employees.Id == id)
       .ToListAsync();

return View(jobs);

但我想知道如何编译它

  .Include(j => j.Employees)
      .....
  .Where(m =>  m.Employees.Id == id)

员工是一个人吗?

更新

看到你的 Job 课程后,我认为你的 where 还可以,但你也可以使用它

 .Where(m =>  m.StaffId == id)

并修复您的编辑操作

 return RedirectToAction("EmployeeJobs", new  id = job.StaffId );

现在应该可以工作了

【讨论】:

嗯,抱歉,这也没用。您可以尝试阅读我在 Rahatur 的回复中留下的评论。我稍微解释了一下。也许我正在尝试一些根本不起作用的东西,这对我这样的初学者来说是不利的。我可能对它没有最好的理解。但我必须说谢谢你,尽管你给了我正确的代码,现在是异步的,哈哈,我想知道如何改变它,所以谢谢!! @AlistairTrotter 我看到 m.Employees.Id == id 。是编译的吗?请发布职位类别 员工正在引用该表中的员工表我有多个员工,每个员工都有自己的 ID/主键 您能发布 Job 和 Employees 课程吗? 好的,刚刚添加,干杯【参考方案2】:

您说过,如果您像下面这样对 Id 进行硬编码,那么它就可以工作:

return RedirectToAction("EmployeeJobs", new  id = 2 );

然后试试这个:

return RedirectToAction("EmployeeJobs", "Jobs", new  id = jobs.StaffId );

【讨论】:

嗨 Rahatur,嗯,我似乎仍然得到相同的结果。什么都没有出现。也许我可以尝试解释更多。运行此 RedirectToAction 时,使用新的 id = jobs.Id。它应用相关作业的 ID。不是有问题的员工 ID。我希望员工 ID 从 EmployeeJobs 动作而不是来自 Jobs 的 ID 进入那里。我相信这个动作是抓取当前的 Job.Id 并将其放置在那里。不是另一个表中的 ID。希望这是有道理的 您已共享作业类。基于此,您可以使用jobs.StaffId,而不是使用jobs.id。我已经相应地更新了答案。【参考方案3】:

尝试返回一个空视图,而不必像这样向它传递参数

 return View(); 

【讨论】:

他为什么要通过返回一个空视图再次加载Edit 视图?问题中明确提到 - 他想转到另一个页面/操作!

以上是关于使用 ID 参数重定向到操作 - .Net Core Web App MVC的主要内容,如果未能解决你的问题,请参考以下文章

使用 web.config 中的 httpRedirect 将 asp.net MVC URL 重定向到特定的控制器/操作/参数

使用参数登录 asp.net 重定向

HTACCESS 重定向使用 URL 参数 ID 号范围

使用参数重定向 PHP URL

VueRouter 参数传递与重定向

重定向到asp.net中的上一页