【问题标题】:How does Html.EditorFor process changes to the modelHtml.EditorFor 如何处理模型的变化
【发布时间】:2011-03-14 22:51:28
【问题描述】:

我试图弄清楚 EditorFor 缓存信息的原因和方式。

这是一个简单的程序,有一个两个文本区域。一个用于输入,一个用于输出。输出文本区域的原因是它使全选副本更容易。

我的代码很简单。首先我的控制器放了一些默认值

    public ActionResult MoveCss()
    {
        MoveCssIO model = new MoveCssIO(); ;
        model.InputCss = "Fish";
        return View(model);
    }

然后我的模型启动并将输出作为输入的大写

    [Required(ErrorMessage="Please provide some text to transform")]
    [DataType(DataType.MultilineText)]
    public string InputCss { get; set; }


    private string _OutputCss;

    [DataType(DataType.MultilineText)]
    public string OutputCss { 
        get
        {
            Transform();
            return _OutputCss;
        }
        set
        {
            _OutputCss = value;
        }
    }

    private void Transform()
    {
        if (!string.IsNullOrWhiteSpace(InputCss))
        {
            _OutputCss = InputCss.ToUpper();
        }
    }

这是我的看法

##
@Html.Encode(Model.OutputCss)
$$
@Html.DisplayFor(model => model.OutputCss)
&&
@Html.EditorFor(model => model.OutputCss)
%%

所以在初始加载时我得到

##
FISH
$$
FISH
&&
<textarea class="text-box multi-line" id="OutputCss" name="OutputCss">
FISH</textarea>
%%

然后我使用 InputCss 的编辑器(未显示)将 InputCss 上的值更改为 ham

    [HttpPost]
    public ActionResult MoveCss(MoveCssIO model)
    {
        return View(model);
    }

这将我的 OutputCss 设置为 HAM 并且页面会重新加载(没有 ajax)但是当我得到输出时

##
HAM
$$
HAM
&&
<textarea class="text-box multi-line" id="OutputCss" name="OutputCss">
FISH</textarea>
%%

我的问题是为什么 Html.EditorFor 中的值与 Html.DisplayFor 不同,我该如何解决这个问题?

更新:增加一点清晰度

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    您的问题非常不清楚,但我怀疑您正在尝试修改 POST 操作中的某些值,并且在呈现视图时您仍然看到旧值。如果是这种情况,您需要将其从模型状态中删除,否则 html 助手将始终绑定旧值:

    [HttpPost]
    public ActionResult MoveCss(MoveCssIO model)
    {
        // you are changing a POSTed value here so make sure
        // you remove it from the model state or HTML helpers 
        // will use the original value
        model.InputCss = "ham"; 
        ModelState.Remove("InputCss");
        return View(model);
    }
    

    另请注意,编辑器/显示模板绝对不涉及缓存

    【讨论】:

    • 我以为它们只是在错误时从模型状态使用,否则使用模型值。
    • 谢谢。我不知道 ModelState 有那个“功能”
    • 我添加了 ModelState.Remove("OutputCss");这似乎已经解决了它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2012-12-26
    • 1970-01-01
    • 2016-08-02
    • 2018-08-02
    • 2021-11-08
    相关资源
    最近更新 更多