2

所以....我的控制器中有一个动作,它基本上复制当前模型并基于该副本返回一个新视图。为了通知用户这是一个副本,我通过 viewbag 附加一条消息,说明它是一个副本。一切似乎都在工作,直到我注意到渲染新视图时使用的不是副本,而是原始视图,但另一方面,视图包已更新,因此显示了消息。

嗯,不知道这是否可以理解,所以我也会尝试用一些伪代码来说明我的意思:

模型

public class Model{
    [ScaffoldColumn(false)]
    [HiddenInput(DisplayValue = false)]
    public Guid Id { get; set; }

    public string Name { get; set; }
}

看法

<input type="submit" name="Copy" value="@_("Copy")"/>

控制器

public ActionResult Copy(model) {
    ViewBag.Message = _("This is a copy.");
    var clone = model.Clone();
    return View("Index", clone);
}

我很难理解这一点,因此非常感谢任何帮助/提示/指针。

哦,我已经多次单步执行代码,以确保克隆确实是克隆。唯一区分它们的是 Id 属性,这是控制器中的新属性,但是当视图呈现时,它又回到了旧的。

4

1 回答 1

1

您需要ModelState在返回克隆之前清除集合,因为 HtmlHelpers 更喜欢重用发布的数据:

public ActionResult Copy(model) {
    ViewBag.Message = _("This is a copy.");
    var clone = model.Clone();
    ModelState.Clear();
    return View("Index", clone);
}

您可以在这篇文章中阅读有关此功能的更多信息:ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes

于 2012-10-05T08:23:50.997 回答