web-dev-qa-db-ja.com

フォームの送信後にtextareaの値をリセットします

  1. / MyController/Message/3に移動して、userID = 3にメッセージを送信したい
  2. これはMessage()[get]アクションを実行します。テキスト領域にテキストを入力し、[保存]をクリックしてフォームを投稿します
  3. Message()[post]アクションは変更を保存し、SomeTextの値を空の文字列にリセットしてビューに戻ります。

この時点では、ViewData ["SomeText"]をstring.Emptyに設定しているため、テキスト領域は空であると想定しています。

ポストアクション後にテキストエリア値が空の文字列に更新されないのはなぜですか?

アクションは次のとおりです。

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Message(int ID)
{
  ViewData["ID"] = ID;
  return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Message(int ID, string SomeText)
{
  // save Text to database
  SaveToDB(ID, SomeText);

  // set the value of SomeText to empty and return to view
  ViewData["SomeText"] = string.Empty;
  return View();
}

そして対応するビュー:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) 
   { %>
      <%= Html.Hidden("ID", ViewData["ID"])%>
      <label for="SomeText">SomeText:</label>
      <%= Html.TextArea("SomeText", ViewData["SomeText"]) %>
      <input type="submit" value="Save" />
<% } %>
</asp:Content>
29
xraminx

問題は、HtmlHelperがModelState値を取得していて、投稿されたデータが入力されていることです。 ModelStateをリセットしてこれをハッキングするのではなく、[get]アクションにリダイレクトして戻してください。 [post]アクションは、次のような一時的なステータスメッセージを設定することもできます。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Message(int ID, string SomeText)
{
  // save Text to database
  SaveToDB(ID, SomeText);

  TempData["message"] = "Message sent";
  return RedirectToAction("Message");
}

これは私にはもっと正しい行動のように思えます。

40
roryf

問題は、ModelStateにポストされた値が再入力されることです。

あなたができることは、Post属性を持つアクションでそれをクリアすることです:

ModelState.Clear();
69
Olivier Payen

HTMLヘルパーはModelStateから値を読み取ります。そして、この振る舞いを無効にするエレガントな方法はありません。

しかし、この行をSaveToDB(ID, SomeText)の後に追加すると、機能するはずです。

ModelState["SomeText"].Value = 
    new ValueProviderResult("", "", CultureInfo.CurrentCulture);
7
Çağdaş Tekin

ModelState全体をクリアするModelState.Clear()を使用する代わりに、必要に応じてModelState.Remove( "SomeText")を実行できます。または、htmlhelper-extensionsなしで入力をレンダリングします。これらは、モデル(またはビューデータ)ではなく、ModelStateから値を取得するように設計されています。

1
Kirsten

私はすべてを試しましたが、次のようなことをしたときにのみ機能しました:

ModelState.Clear();
//This will clear the address that was submited
viewModel.Address = new Address();
viewModel.Message = "Dados salvos com sucesso!";
return View("Addresses", ReturnViewModel(viewModel));

お役に立てれば。

1
MalachiteBR

S.th.このような:

追加:

ModelState.Clear();

送信ボタンアクションメソッドのreturnステートメントの前。私のために働く。それはあなたのために働くことができます。

0
user6243946

モデルの状態がエラーで更新された可能性はありますか?モデルの状態が有効でない場合は、ビューデータやモデルからではなく、モデルの状態から試行された値を取得すると思います。

[〜#〜] edit [〜#〜]ソースコード の関連セクションを含めます以下のTextArea HtmlHelper拡張。モデルのエラーがあった場合はモデルの状態から値を取得し、そうでない場合はViewDataから使用します。 Postメソッドでは、「SomeText」キーは設定するまで存在しないはずです。つまり、GETに応答するバージョンのコードから引き継がれないことに注意してください。

ViewDataに値を明示的に指定するため、useViewDataはfalseである必要があり、モデル状態でエラーが設定されていない限り、attemptedValueはfalseである必要があります。

    // If there are any errors for a named field, we add the css attribute.
    ModelState modelState;
    if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState)) {
        if (modelState.Errors.Count > 0) {
            tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
        }
    }

    // The first newline is always trimmed when a TextArea is rendered, so we add an extra one
    // in case the value being rendered is something like "\r\nHello".
    // The attempted value receives precedence over the explicitly supplied value parameter.
    string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
    tagBuilder.SetInnerText(Environment.NewLine + (attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : value)));
    return tagBuilder.ToString(TagRenderMode.Normal);
0
tvanfosson

それはクライアントサイドの振る舞いです。 JavaScriptの使用をお勧めします。 JQueryを使用する場合は、次のように実行できます。

<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>

私はもうJavascriptを使用していませんが、通常のJSは次のようなものだと信じています。

document.getElementById("SomeText").value = "";

(これは、ロードイベントの1つで行います。

<body onload="...">

お役に立てれば。

0
Jeff Ancel

ViewData ["SomeText"]が空であるため、textareaが内部でRequest.Formから値を取得していることはかなり確実です。

0
Mike Geise