【问题标题】:ASP.NET MVC, can the controller mutate the submitted values?ASP.NET MVC,控制器可以改变提交的值吗?
【发布时间】:2011-01-26 08:19:45
【问题描述】:

在 ASP.NET MVC 中是否允许更改提交的值?

[HttpPost]
public ActionResult Create(Person toCreate)
{
    toCreate.Lastname = toCreate.Lastname + "-A-";

    return View(toCreate);
}

我尝试了该代码,但 ASP.NET MVC 一直显示用户提交的值

[更新]

这个:

[HttpPost]
public ActionResult Create(Person toCreate)
{
    return View(new Person { Lastname = "Lennon" });
}

或者这个:

[HttpPost]
public ActionResult Create(Person toCreate)
{
    return View();
}

仍然显示用户输入的值,这让我想到,为什么生成的代码需要在HttpPost中发出:return View(toCreate)? 为什么不直接返回 View()? 至少它不会违反控制器可以覆盖值的预期

[更新:2010-06-29]

在这里找到答案:ASP.NET MVC : Changing model's properties on postback 和这里:Setting ModelState values in custom model binder

工作代码:

[HttpPost]
public ActionResult Create(Person toCreate)
{
    ModelState.Remove("Lastname");
    toCreate.Lastname = toCreate.Lastname + "-A-";
    return View(toCreate);
}

【问题讨论】:

  • 发帖后不应该重定向吗?

标签: asp.net-mvc


【解决方案1】:

显然,一旦您更改了某个键的值,就无法重新验证 ModelState。 IsValid 保持为 false,因为为某个键设置新值不会触发重新验证。

解决方案是首先删除触发 IsValid 为 false 的键并重新创建它并为其分配值。当您这样做时,ModelState 会自动重新验证,如果一切正常,IsValid 返回 true。

像这样:

bindingContext.ModelState.Remove("Slug");
    bindingContext.ModelState.Add("Slug", new ModelState());
    bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));

【讨论】:

    【解决方案2】:

    是的,这是允许的。

    为什么您的视图显示的是旧值,我不能根据您的代码说出来。你访问吗

    Model.Lastname
    

    在 Create.aspx 中的 Viewcode 中?

    【讨论】:

    • 不,我从继承 Controller 的类中访问 toCreate.Lastname
    【解决方案3】:

    如果您使用 Html 帮助器来呈现您的文本框并绑定到您的模型,例如:

    <%= Html.TextBox("toCreate.LastName", Model.Person.LastName) %>
    

    当从 POST 呈现页面时,默认情况下,帮助程序呈现在 POST 数据中发送的值。 IE。它只第一次使用 Model.Person.LastName(一个 GET)。这通常是首选方法,但如果您想避免这种情况,只需自己编写 html:

    <input type="text" name="toCreate.LastName" value="<%= Html.Encode(Model.Person.LastName)" />
    

    【讨论】:

    • 我认为程序的控制部分基本上都是在控制器中完成的,视图和模型基本上是mvc三巨头中非常轻量级的播放器(尤其是火花视图)
    • 这不是关于控制,而是关于如何呈现文本框中的值(在 POST 之后),这是视图的工作 - 至少这就是我猜测的原因问题是:)
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2011-07-15
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多