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 値から復元されます。それは理にかなっていますよね?ユーザーが入力してサーバーに送信したばかりの値とは異なる値をテキスト ボックスに表示することは望ましくありません。

更新されたモデルをユーザーに表示する場合は、別のアクションが必要であり、投稿アクションからそのアクションにリダイレクトする必要があります。

基本的に、ビューをレンダリングしてモデルを編集するアクションと、モデルをデータベースなどに保存してリクエストを前のアクションにリダイレクトするアクションの2つのアクションが必要です。

例:

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 に答える