この時点では、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>
問題は、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");
}
これは私にはもっと正しい行動のように思えます。
問題は、ModelStateにポストされた値が再入力されることです。
あなたができることは、Post属性を持つアクションでそれをクリアすることです:
ModelState.Clear();
HTMLヘルパーはModelStateから値を読み取ります。そして、この振る舞いを無効にするエレガントな方法はありません。
しかし、この行をSaveToDB(ID, SomeText)
の後に追加すると、機能するはずです。
ModelState["SomeText"].Value =
new ValueProviderResult("", "", CultureInfo.CurrentCulture);
ModelState全体をクリアするModelState.Clear()を使用する代わりに、必要に応じてModelState.Remove( "SomeText")を実行できます。または、htmlhelper-extensionsなしで入力をレンダリングします。これらは、モデル(またはビューデータ)ではなく、ModelStateから値を取得するように設計されています。
私はすべてを試しましたが、次のようなことをしたときにのみ機能しました:
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));
お役に立てれば。
S.th.このような:
追加:
ModelState.Clear();
送信ボタンアクションメソッドのreturn
ステートメントの前。私のために働く。それはあなたのために働くことができます。
モデルの状態がエラーで更新された可能性はありますか?モデルの状態が有効でない場合は、ビューデータやモデルからではなく、モデルの状態から試行された値を取得すると思います。
[〜#〜] 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);
それはクライアントサイドの振る舞いです。 JavaScriptの使用をお勧めします。 JQueryを使用する場合は、次のように実行できます。
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
私はもうJavascriptを使用していませんが、通常のJSは次のようなものだと信じています。
document.getElementById("SomeText").value = "";
(これは、ロードイベントの1つで行います。
<body onload="...">
お役に立てれば。
ViewData ["SomeText"]が空であるため、textareaが内部でRequest.Formから値を取得していることはかなり確実です。