在Asp.Net MVC视图中,不要渲染控制器所做的模型更改

new*_*way 4 asp.net-mvc razor asp.net-mvc-3

我是ASP.NET MVC的新手,需要一些帮助.
当通过post触发"P01"动作时,我将接收强类型模型作为参数,更改此模型实例的属性并调用"return View(model);".
在视图中使用"@ Html.TextBoxFor(m => m.p01campo01)"语法.这里
有人有类似的问题,并获得使用语法即时使用的建议.这里 有人使用"<%= Html.TextBox("Person.LastName",ViewData.Model.LastName)%>"语法.问题是当呈现视图时文本框具有最后发布的值,而不是我在控制器中分配的值.

感谢所有试图帮助我的人,我把第一个答案作为答案.

有我的代码:

*************************************************
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MyTest.Models
{
    //-------
    public class testePg01
    {        
        [DataType(DataType.Text)]
        [Display(Name = "p01campo01")]
        public string p01campo01 { get; set; }

        [DataType(DataType.Text)]
        [Display(Name = "p01campo02")]
        public string p01campo02 { get; set; }

    }
    //-------
}
*************************************************

*************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyTest.Models;

namespace MyTest.Controllers
{
    public class TesteController : Controller
    {
        //-------
        [AcceptVerbs(HttpVerbs.Get)]        
        public ActionResult P01()
        {
            return View();
        }
        //-------
        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateAntiForgeryToken]
        public ActionResult P01(testePg01 model)
        {
            model.p01campo01 = model.p01campo01 + "#updatedHereButNotInView";
            model.p01campo02 = model.p01campo02 + "#updatedHereButNotInView";
            return View(model); // it dont return updated
        }
        //-------

    }
}
*************************************************

*************************************************
@model MyTest.Models.testePg01

@{
    ViewBag.Title = "P01";
}

<h2>P01</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.ValidationSummary(true, "Erro na pagina.")

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    <div>    
        <fieldset>
            <legend>Test P01</legend>

            <div class="editor-label">
                @Html.LabelFor(m => m.p01campo01)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.p01campo01)
                @Html.ValidationMessageFor(m => m.p01campo01)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.p01campo02)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.p01campo02)
                @Html.ValidationMessageFor(m => m.p01campo02)
            </div>
            <p>
                <input type="submit" value="P01" />
            </p>
        </fieldset>
    </div>
}
*************************************************
Run Code Online (Sandbox Code Playgroud)

Jef*_*ver 6

默认情况下,不会渲染帖子中进行的模型更改。相反,它使用在模型中传递给控制器​​方法的内容。要解决此问题,请尝试添加:

ModelState.Clear();
Run Code Online (Sandbox Code Playgroud)

在RedirectToAction之前。


Joa*_*oao 5

因为它是一个HttpPost HTML帮助程序首先查看POSTed数据,然后才查看模型.

您要从州中删除该属性:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult P01(testePg01 model)
{
    ModelState.Remove("p01campo01");
    ModelState.Remove("p01campo02");

    model.p01campo01 = model.p01campo01 + "#updatedHereButNotInView";
    model.p01campo02 = model.p01campo02 + "#updatedHereButNotInView";

    return View(model);         
}
Run Code Online (Sandbox Code Playgroud)

因为ModelState是一个字典,您还可以使用Clear()它从状态中删除所有属性:

ModelState.Clear();
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在MVC3可以使用[HttpPost][HttpGet]insted的的[Acceptverb(...)]