Asp.net mvc ASP.NET MVC,控制器是否可以更改提交的值?

Asp.net mvc ASP.NET MVC,控制器是否可以更改提交的值?,asp.net-mvc,Asp.net Mvc,在ASP.NET MVC中是否允许更改提交的值 [HttpPost] public ActionResult Create(Person toCreate) { toCreate.Lastname = toCreate.Lastname + "-A-"; return View(toCreate); } 我尝试了该代码,但ASP.NET MVC一直显示用户提交的值 [更新] 这: 或者这个: [HttpPost] public ActionResult Create(Pers

在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();
}
仍然显示用户输入的值,这让我思考,为什么生成的代码需要在HttpPost中发出:return视图(toCreate)为什么不直接返回View()?至少它不会违背可以从控制器重写值的期望

[更新:2010-06-29]

在这里找到答案:在这里:

工作代码:

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

为什么您的视图显示的是基于代码的旧值,我不能说。你能进入吗

Model.Lastname

在Create.aspx?

的视图代码中,如果您使用Html帮助程序呈现文本框并绑定到模型,例如:

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

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

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

显然,一旦更改某个键的值,就无法重新验证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));

发布后你不应该重定向吗?不,我访问Create。Lastname来自继承Controlleri的类我认为程序的控制部分基本上都是在controller中完成的,视图和模型基本上是mvc triumvirate(特别是spark view)中非常轻量级的玩家。这与控制无关,这是关于文本框中的值是如何呈现的(在帖子之后),这是视图的工作-至少我猜这就是问题的原因:)
bindingContext.ModelState.Remove("Slug");
    bindingContext.ModelState.Add("Slug", new ModelState());
    bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));