2016-09-01 41 views
0

我试图在每个操作之前插入一个断点,并且我在HttpGet方法中的ClassId值取需要删除的类的实际(正确)Id时卡住了一点HttpPost方法中的ClassId值与HttpGet方法的ClassId值不匹配,HttpPost中ClassId的Infact值返回null,因此我遇到了对象具有空值的异常错误。如果有人能够承认我可以消除这种错误,那将是非常好的。谢谢。下面分别是控制器的代码和相应的视图。控制器中的HttpPost方法与HttpGet方法不协调

控制器代码

[HttpGet] 
    public IActionResult Delete(int ClassId) 
    { 
     return View(db.Class.Include(x => x.Student).First(c => c.ClassId == ClassId)); 
    } 


    [ActionName("Delete")] 
    [HttpPost] 
    public IActionResult DeletePost(int ClassId) 
    { 
     var r = db.Class.First(a => a.ClassId == ClassId); 
     var student = r.StudentId.ToString(); 
     db.Remove(r); 
     db.SaveChanges(); 
     return RedirectToAction("Details", "Student", new { id = student }); 
    } 

查看代码

@model DemoProject.Models.Class 

@{ 
    ViewData["Title"] = "Delete Class"; 
    } 

    <h3>Are you sure you want to delete this?</h3> 
       <div> 
        <hr /> 
        <dl class="dl-horizontal"> 
         <dt> 
          @Html.DisplayNameFor(model => model.ClassName) 
         </dt> 
         <dd> 
          @Html.DisplayFor(model => model.ClassName) 
         </dd> 
         <dt> 
          @Html.DisplayNameFor(model => model.Title) 
         </dt> 
         <dd> 
          @Html.DisplayFor(model => model.Title) 
         </dd> 
         <dt> 
          @Html.DisplayNameFor(model => model.Text) 
         </dt> 
         <dd> 
          @Html.DisplayFor(model => model.Text) 
         </dd> 

        </dl> 

        <form asp-action="Delete"> 
         <div class="form-actions no-color"> 
          <input type="submit" value="Delete" class="btn btn-danger" /> 
          <div class="row"> 
           <a asp-action="Details" asp-controller="Student" asp-route-id="@Model.Student.StudentId">Back</a> 
          </div> 
         </div> 
        </form> 
       </div> 
+1

你可以将代码发布到你的视图吗? –

+0

@CoreySmith我刚刚发布了它 – Priyanshu

+1

你似乎没有将ID从你的表单传递给post方法。使用隐藏字段或类似内容。 –

回答

3

你有两个选择:

  1. 正如@ stephen.vakil说,添加一个隐藏字段的ClassId属性您在<form>元素内的视图。

查看与隐藏字段

@model ModelBinding.Models.Class 

@{ 
    ViewData["Title"] = "Delete Class"; 
} 

<h3>Are you sure you want to delete this?</h3> 
<div> 
    <hr/> 
    <dl class="dl-horizontal"> 
    <dt> 
     @Html.DisplayNameFor(model => model.ClassName) 
    </dt> 
    <dd> 
     @Html.DisplayFor(model => model.ClassName) 
    </dd> 
    <dt> 
     @Html.DisplayNameFor(model => model.Title) 
    </dt> 
    <dd> 
     @Html.DisplayFor(model => model.Title) 
    </dd> 
    <dt> 
     @Html.DisplayNameFor(model => model.Text) 
    </dt> 
    <dd> 
     @Html.DisplayFor(model => model.Text) 
    </dd> 

    </dl> 

    <form asp-action="Delete"> 
    <div class="form-actions no-color"> 
     @Html.HiddenFor(model => model.ClassId) 
     <input type="submit" value="Delete" class="btn btn-danger"/> 
     <div class="row"> 
     <a asp-action="Details" asp-controller="Student" asp-route-id="@Model.Student.StudentId">Back</a> 
     </div> 
    </div> 
    </form> 
</div> 
  • 添加asp-route-id="@Model.ClassId"到您<form>标签和更改DeletePost方法的ClassId参数名id
  • 查看与ASP路由-ID

    @model ModelBinding.Models.Class 
    
    @{ 
        ViewData["Title"] = "Delete Class"; 
    } 
    
    <h3>Are you sure you want to delete this?</h3> 
    <div> 
        <hr/> 
        <dl class="dl-horizontal"> 
        <dt> 
         @Html.DisplayNameFor(model => model.ClassName) 
        </dt> 
        <dd> 
         @Html.DisplayFor(model => model.ClassName) 
        </dd> 
        <dt> 
         @Html.DisplayNameFor(model => model.Title) 
        </dt> 
        <dd> 
         @Html.DisplayFor(model => model.Title) 
        </dd> 
        <dt> 
         @Html.DisplayNameFor(model => model.Text) 
        </dt> 
        <dd> 
         @Html.DisplayFor(model => model.Text) 
        </dd> 
    
        </dl> 
    
        <form asp-action="Delete" asp-route-id="@Model.ClassId"> 
        <div class="form-actions no-color"> 
         <input type="submit" value="Delete" class="btn btn-danger"/> 
         <div class="row"> 
         <a asp-action="Details" asp-controller="Student" asp-route-id="@Model.Student.StudentId">Back</a> 
         </div> 
        </div> 
        </form> 
    </div> 
    

    控制器,重命名操作参数

    [HttpGet] 
    public IActionResult Delete(int classId) 
    { 
        return View(db.Class.Include(x => x.Student).First(c => c.ClassId == classId)); 
    } 
    
    [ActionName("Delete")] 
    [HttpPost] 
    public IActionResult DeletePost(int id) 
    { 
        var r = db.Class.First(a => a.ClassId == id); 
        var student = r.StudentId.ToString(); 
        db.Remove(r); 
        db.SaveChanges(); 
        return RedirectToAction("Details", "Student", new { id = student }); 
    } 
    

    除非你只是不能使用某种原因<hidden>领域,选项1是最好的选择。