2017-11-08 4 views
1

누락 나는이 자습서를 실행하기 위해 노력하고있어. Index.cshtml, Details.cshtml 및 Edit.cshtml을 만들었습니다. 데이터베이스 연결이 작동 중입니다. 직원 이름 뒤에 편집 또는 세부 정보 링크를 클릭하면 라우팅이 작동하지 않는 것 같습니다. 나는 빈 곳을 얻는다.라우팅 문제가 인수

Index.cshtml

@using MyApp.Controllers 
@model HomePageViewModel 

@{ 
    ViewBag.Title = "Home"; 
} 
<h1>Welcome!</h1> 

<table> 
    @foreach (var employee in Model.Employees) 
    { 
     <tr> 
      <td>@employee.name</td> 
      <td> 
       <a asp-controller="Employee" asp-action="Details" 
        asp-routeid="@employee.id">Details</a> 
       <a asp-controller="Employee" asp-action="Edit" 
        asp-routeid="@employee.id">Edit</a> 
      </td> 
     </tr> 
    } 
</table> 

Edit.cshtml

@model MyApp.Models.Employees 
@{ 
    ViewBag.Title = $"Edit {Model.name}"; 
} 
<h1>Edit @Model.name</h1> 

<form asp-action="Edit" method="post"> 
    <div> 
     <label asp-for="name"></label> 
     <input asp-for="name" /> 
     <span asp-validation-for="name"></span> 
    </div> 

    <div> 
     <input type="submit" value="Save" /> 
    </div> 
</form> 

전체 컨트롤러

using Microsoft.AspNetCore.Mvc; 
using MyApp.Models; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Threading.Tasks; 

namespace MyApp.Controllers 
{ 
    public class EmployeeController : Controller 
    { 
     public ViewResult Index() 
     { 
      var model = new HomePageViewModel(); 
      using (var context = new FirstAppDemoDbContext()) 
      { 
       SQLEmployeeData sqlData = new SQLEmployeeData(context); 
       model.Employees = sqlData.GetAll(); 
      } 
      return View(model); 
     } 
     public IActionResult Details(int id) 
     { 
      var context = new FirstAppDemoDbContext(); 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      var model = sqlData.Get(id); 


     if (model == null) 
      { 
       return RedirectToAction("Index"); 
      } 
      return View(model); 
     } 
     [HttpGet] 
     public IActionResult Edit(int id) 
     { 
      var context = new FirstAppDemoDbContext(); 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      var model = sqlData.Get(id); 

      if (model == null) 
      { 
       return RedirectToAction("Index"); 
      } 
      return View(model); 
     } 
     [HttpPost] 
     public IActionResult Edit(int id, EmployeeEditViewModel input) 
     { 
      var context = new FirstAppDemoDbContext(); 
      SQLEmployeeData sqlData = new SQLEmployeeData(context); 
      var employee = sqlData.Get(id); 

      if (employee != null && ModelState.IsValid) 
      { 
       employee.name = input.Name; 
       context.SaveChanges(); 
       return RedirectToAction("Details", new { id = employee.id }); 
      } 
      return View(employee); 
     } 
    } 
    public class SQLEmployeeData 
    { 
     private FirstAppDemoDbContext _context { get; set; } 
     public SQLEmployeeData(FirstAppDemoDbContext context) 
     { 
      _context = context; 
     } 
     public void Add(Employees emp) 
     { 
      _context.Add(emp); 
      _context.SaveChanges(); 
     } 
     public Employees Get(int ID) 
     { 
      return _context.Employees.FirstOrDefault(e => e.id == ID); 
     } 
     public IEnumerable<Employees> GetAll() 
     { 
      return _context.Employees.ToList<Employees>(); 
     } 
    } 
    public class HomePageViewModel 
    { 
     public IEnumerable<Employees> Employees { get; set; } 
    } 
    public class EmployeeEditViewModel 
    { 
     [Required, MaxLength(80)] 
     public string Name { get; set; } 
    } 
} 

응용 프로그램은 로컬 호스트 요청 : 인수 XXXX/직원/편집 < 0> (id 1 또는 2 대신 ...) localhost : xxxx/Employee의 내 인덱스 목록으로 리디렉션됩니다. . localhost : xxxx/Employee/Edit/1을 예상했지만 id 인수가 누락 된 것 같습니다. _ViewImports.cshtml

나는 무엇을 시도 할 수있는 내가 @addTagHelper의 *를 사용하고

, Microsoft.AspNetCore.Mvc.TagHelpers? 더 많은 정보가 필요하시면 알려주십시오! 앞으로 당신의 도움에 감사드립니다!

+0

public IActionResult Edit (int id) 내부에 중단 점을 넣고 디버그에서 실행하여이 메서드로 실행되는지 확인하십시오. – Jacky

+0

Controller를 Employee로 변경 했으므로 라우팅에서 약간의 문제가 발생할 수 있습니다. 전체 EmployeeController.cs를 게시하면 더 쉽게 수행 할 수 있습니다 – Jacky

답변

1

나는 당신의 문제는 당신이 @employee.id이 경로에 사용되도록 지정 Index.cshtml 파일에 기대 차이는 routeid 사이의 -입니다.경로 매개 변수를 어떻게 Form Tag Helper 작품에 대한 자세한 내용은 설명서를 참조하십시오 :

<Parameter Name>이 경로 값에 추가됩니다 asp-route-<Parameter Name> 속성을 제공합니다.

+0

감사합니다! 그건 내 문제가 :) 해결되었습니다! – dafna

1

우리가 통과해야하는 많은 시나리오가있다, 그래서 오히려 대신 다수의 의견에, 여기에 쓰기 :

  1. 디버그 마다 한 줄을 실행, 중단 점을 넣어. 그것이 잘못되었는지보십시오. 이 시나리오

    , 내가 잘못 여기에 갔다 의심 :

    if (model == null) 
    { 
        return RedirectToAction("Index"); 
    } 
    

    모델이 null이 될 수있다, 따라서 다시 기본 색인로 리디렉션합니다.

  2. "집"대신 컨트롤러 이름을 "직원"으로 사용하기 때문에 tutorialpoint와 비교하면 라우팅이 어딘가에서 깨질 수 있습니다. 라우팅 파일을 확인하려면 기본적으로 다음과 같아야합니다.

    routes.MapRoute(
        name: "default_route", 
        template: "{controller}/{action}/{id?}", 
        defaults: new { controller = "Home", action = "Index" }); 
    

    여기에 변경 했습니까? 에

    asp-routeid="@employee.id" 
    

    변경이 모두 :

    asp-route-id="@employee.id" 
    

+0

감사합니다. 이제 전체 컨트롤러를 게시했습니다. 라우팅 설정을 수정하려고했습니다. 또한 "Employee"를 기본값으로 사용하여 작동하지 않습니다. 디버깅은 ID가 항상 "0"이고 어떤 직원이 내가 선택했는지는 중요하지 않음을 보여줍니다. 어떤 생각? 도와 줘서 고맙다! – dafna

+0

@dafna는 Kirk 대답을보고, 다른 시나리오입니다. – Jacky