2

我想知道在同一视图模型中处理可编辑/只读字段的最佳做法是什么。对于更大的 ViewModel,我正面临这个问题,但假设我有一个非常简单的 ViewModel:

public class BaseListViewModel
{
    public int Id { get; set; }
    public bool IsCheckedForAction { get; set; }
    public string DisplayName { get; set; }
}

我的部分视图:

@model Wims.Website.ViewModels.Shared.BaseModelListViewModel
@using Wims.Website.Classes.Helpers.ExtentionMethods
<div class="dataDetail">
        <div>
            <div class="float-left">
                @Html.CheckBoxFor(model => model.IsCheckedForAction)
            </div>

            <div class="float-left">
                @Html.LabelFor(model => model.IsCheckedForAction, Model.DisplayName)


                @Html.GenerateSecureDataControls(w => w.Id)
            </div>
        </div>
    </div>
<div style="clear: both"></div>

显然,当我发布我的数据时,DisplayName 不会被填写。让我们假设一些验证失败,我只返回我收到的数据,DisplayName 将丢失。

    [HttpPost]

public ActionResult Edit(BaseListViewModel stuff)
{
    if (ModelState.IsValid)
    {
        ...
        return View("Index");
    }
    return View(stuff);
}

我知道有几种方法可以解决这个问题:

1) 添加

  @Html.HiddenFor(model => model.DisplayName)

在视图中,如果它只有 1 个字段,那没关系,但是,如果我确实有 10 个仅显示字段会发生什么?

2) 在 [HttpPost] 中重新查询数据 if (!Model.isValid)。

3)我想我可以将它缓存在 TempData 中?

最好的方法是什么?谢谢!

编辑:如果验证失败,我试图避免重新查询数据

4

2 回答 2

3

我会使用PRG模式。它更干燥,因为您只在 GET 操作中构建 ViewModel。如果验证失败,则重定向到 GET 并从 tempdata 中获取模型状态。

本文中的属性,http://www.jefclaes.be/2012/06/persisting-model-state-when-using-prg.html,或来自 MVC Contrib https://github.com/mvccontrib/MvcContrib /blob/master/src/MVCContrib/Filters/ModelStateToTempDataAttribute.cs,方便在 POST 和 GET 之间传递 Modelstate

于 2012-12-18T08:38:19.757 回答
0

POST 操作应执行与 GET 操作相同的视图模型初始化。您可以将初始化代码移动到控制器中的公共私有函数中。这样做的原因是,如果由于对相同数据的某些并发更改而导致验证失败,则验证错误将与新数据一起显示给用户。如果视图允许,您也可以使用 PRG 模式。

于 2013-03-26T04:26:39.053 回答