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>
4

1 回答 1

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 一样,以便所有值都回传到服务器,而您不必再次进行数据库调用。

于 2012-07-11T20:09:49.917 回答