MVC3 Html编辑器助手显示旧模型值

时间:2012-05-29 20:05:16

标签: asp.net asp.net-mvc razor

表单提交后,Html编辑器助手(TextBox,Editor,TextArea)显示旧值而不是model.text的当前值

显示助手(Display,DisplayText)显示正确的值。

编辑助手有没有办法显示当前的model.text值?

模型

namespace TestProject.Models
{
  public class FormField
  {
    public string text { get;set; }
  }
}

控制器

using System.Web.Mvc;
namespace TestProject.Controllers
{
  public class FormFieldController : Controller
  {
     public ActionResult Index (Models.FormField model=null)
     {
       model.text += "_changed";
       return View(model);
     }
  }
}

查看

@model TestProject.Models.FormField
@using (Html.BeginForm()){
  <div>
    @Html.DisplayFor(m => m.text)
  </div>
  <div>
    @Html.TextBoxFor(m => m.text)
  </div>
  <input type="submit" />
}

3 个答案:

答案 0 :(得分:1)

当您将表单提交给MVC操作时,输入字段的值将从表单中可用的POSTEd值中恢复,而不是从模型中恢复。那有道理吗?我们不希望用户在文本框中显示的值与刚刚输入并提交给服务器的值不同。

如果您想向用户显示更新的模型,那么您应该有另一个操作,并且从后期操作中您必须重定向到该操作。

基本上,您应该有两个操作,一个操作使视图编辑模型,另一个操作将模型保存到数据库或其他任何操作,并将请求重定向到前一个操作。

一个例子:

public class FormFieldController : Controller
{
    // action returns a view to edit the model
    public ActionResult Edit(int id)
    {
      var model = .. get from db based on id
      return View(model);
    }

    // action saves the updated model and redirects to the above action
    // again for editing the model
    [HttpPost]
    public ActionResult Edit(SomeModel model)
    {
       // save to db
       return RedirectToAction("Edit");
    }
}

答案 1 :(得分:1)

使用HTML编辑器(如HTML.EditorFor()或HTML.DisplayFor())时,如果尝试修改或更改控制器操作中的模型值,除非删除模型的ModelState,否则不会看到任何更改你要改变的财产。

虽然@Mark是正确的,但 没有单独的控制器操作(但您通常会这样做)并且您不需要重定向到原始操作。

e.g。 - 调用ModelState.Remove( modelPropertyName )...

public ActionResult Index (Models.FormField model=null)
 {
   ModelState.Remove("text");
   model.text += "_changed";
   return View(model);
 }

如果你想为GET和POST分别采取行动(推荐),你可以做......

public ActionResult Index ()
 {
   Models.FormField model = new Models.FormField();  // or get from database etc.

   // set up your model defaults, etc. here if needed

   return View(model);
 }

[HttpPost]  // Attribute means this action method will be used when the form is posted
public ActionResult Index (Models.FormField model)
 {
   // Validate your model etc. here if needed ...

   ModelState.Remove("text"); // Remove the ModelState so that Html Editors etc. will update

   model.text += "_changed";  // Make any changes we want

   return View(model);
 }

答案 2 :(得分:0)

我有一些类似的问题,我希望我可以帮助别人有类似的问题:

ActionExecutingContextController.ViewData。 如你所见:

new ActionExecutingContext().Controller.ViewData

此ViewData包含ModelStateModel。 ModelState显示模型的状态已传递给控制器​​,例如。当您在ModelState上出现错误时,不可接受的Model会将其状态传递给View。所以你会看到旧的价值。然后,您必须手动更改ModelState的Model值。 例如,清除数据:

  ModelState.SetModelValue("MyDateTime", new ValueProviderResult("", "", CultureInfo.CurrentCulture));

您也可以像here一样操纵ViewData。 EditorForDisplayFor()等使用此ViewData内容。