2012-07-11 99 views
0

我使用MVC 3,我有一个视图删除我的数据库中的元素。服务层在授权操作之前检查所有逻辑是否在位。在违反角色的情况下,消息出现在Html.Summary中,因此删除操作将中止。数据不会显示在视图后

我的问题是,当服务层的Html.Summary中的消息到达视图丢失了各个字段的数据,所以你看不到项目的ID,名称和描述。

你能指出我在正确的方向吗?我做错了什么?由于

public ActionResult Delete(int id) 
    { 
     Typology typology = _typologytService.FindById(id); 
     TypologyDeleteViewModel deleteViewModel = Mapper.Map<Typology, TypologyDeleteViewModel>(typology); 
     return View(deleteViewModel); 
    } 

    // 
    // POST: /ManageTypologies/Delete/5 

    [HttpPost] 
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel); 
      _typologytService.Delete(typology.TypologyId); 
      if (ModelState.IsValid) 
       return RedirectToAction("Index"); 
     } 
     return View();   
    } 

@model xxx.ViewModels.TypologyDeleteViewModel 
@{ 
    ViewBag.Title = "Delete"; 
} 
<h2> 
    Delete</h2> 
<h3> 
    Are you sure you want to delete this?</h3> 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.TypologyId) 
    <fieldset> 
     <legend>TypologyDeleteViewModel</legend> 
     <div class="display-label"> 
      TypologyId</div> 
     <div class="display-field"> 
      @Html.DisplayFor(model => model.TypologyId) 
     </div> 
     <div class="display-label"> 
      Name</div> 
     <div class="display-field"> 
      @Html.DisplayFor(model => model.Name) 
     </div> 
     <div class="display-label"> 
      Description</div> 
     <div class="display-field"> 
      @Html.DisplayFor(model => model.Description) 
     </div> 
     <p> 
      <input type="submit" value="Delete" /> 
     </p> 
    </fieldset> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

回答

1

更改自己的信息的方法:

[HttpPost] 
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel); 
      _typologytService.Delete(typology.TypologyId); 
      if (ModelState.IsValid) 
       return RedirectToAction("Index"); 
     } 
     return View(deleteViewModel);   
    } 

您没有通过模型回视图当您返回一个无效的模型状态。另外,是否有一个原因在上面的代码中检查了两次ModelState.IsValid属性?我没有看到你可能会添加一个ModelStateError,并且没有第二个if语句的路径。

最后,如果您的deleteViewModel包含任何下拉列表等(在这种情况下您不会出现)...您将需要在返回视图之前重新填充它们。

编辑

在你的情况,上面的,因为你不会工作不使用EditorFor HTML帮助您的其他特性。您的观点正在分发相当于<span>标签的描述等,这些标签没有发布回服务器。唯一回来的是您的Id属性,因为它位于<input type="hidden"字段中。

所以 - 你的情况,你需要更新你的动作方法:

[HttpPost] 
    public ActionResult Delete(TypologyDeleteViewModel deleteViewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      Typology typology = Mapper.Map<TypologyDeleteViewModel, Typology>(deleteViewModel); 
      _typologytService.Delete(typology.TypologyId); 
      if (ModelState.IsValid) 
       return RedirectToAction("Index"); 
     } 
     Typology typology = _typologytService.FindById(typology.TypologyId); 
     TypologyDeleteViewModel deleteViewModel = Mapper.Map<Typology, TypologyDeleteViewModel>(typology); 
     return View(deleteViewModel);   
    } 

,或者存储在隐藏输入字段的值,就像你与你的ID这样做,所有的值都回发到服务器,您不必再次进行数据库调用。

+0

感谢汤米,我用你的代码,加上我有添加一些隐藏的字段为@ Html.HiddenFor(型号=> model.TypologyId) @ Html.HiddenFor(型号=> model.Name) @ Html.HiddenFor( model => model.Description)现在正在工作 – GibboK 2012-07-11 20:13:12

+0

我正在检查ModelState两次,因为_typologytService是服务层,可以使他ModelState无效添加一些messageg。我可以问你为什么我不得不在视图中添加隐藏字段?非常感谢我会接受你的回答:-) – GibboK 2012-07-11 20:15:02

+1

在两个帐户上都陷入困境 - 我刚刚发现我的错误更新了如何在不传递隐藏输入的情况下做到这一点的答案。但无论哪种方式工作! – Tommy 2012-07-11 20:17:01