3

表单提交后 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" />
}
4

3 回答 3

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");
    }
}
于 2012-05-30T09:11:15.743 回答
1

使用 HTML.EditorFor() 或 HTML.DisplayFor() 等 HTML 编辑器时,如果您尝试修改或更改控制器操作中的模型值,您将看不到任何更改,除非您删除所需模型属性的 ModelState改变。

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

例如 - 调用 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);
 }
于 2012-09-02T14:04:18.830 回答
0

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

ActionExecutingContextController.ViewData。如你看到的:

new ActionExecutingContext().Controller.ViewData

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

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

您也可以像这里一样操作 ViewData 。,等等,使用这个EditorFor内容。DisplayFor()ViewData

于 2017-03-04T06:17:25.383 回答