此时我希望文本区域为空,因为我已将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>
答案 0 :(得分:68)
问题是您的ModelState会重新填充已发布的值。
您可以做的是在具有Post属性的Action上清除它:
ModelState.Clear();
答案 1 :(得分:40)
问题是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");
}
在我看来,这似乎是更正确的行为。
答案 2 :(得分:7)
html助手从ModelState中读取值。并且没有优雅的方法来覆盖这种行为。
但如果你在SaveToDB(ID, SomeText)
之后添加这一行,它应该有效:
ModelState["SomeText"].Value =
new ValueProviderResult("", "", CultureInfo.CurrentCulture);
答案 3 :(得分:1)
我尝试了所有的东西,但只有在我这样做的时候才有效:
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));
希望这有帮助。
答案 4 :(得分:1)
如果您愿意,可以使用ModelState.mlear()清除整个模型状态,而不是使用ModelState.Remove(“SomeText”)。或者在没有htmlhelper-extensions的情况下渲染Input。 它们被设计为从ModelState而不是Model(或viewdata)获取Value。
答案 5 :(得分:0)
模型状态是否可能因错误而更新?我相信如果模型状态无效,它将从模型状态而不是从视图数据或模型中提取尝试值。
修改强>: 我在下面的TextArea HtmlHelper扩展中包含了source code的相关部分。在我看来,它完全符合我的预期 - 如果出现模型错误,它会从模型状态中提取值,否则它会从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);
答案 6 :(得分:0)
这是一种客户端行为。我建议使用javascript。如果你使用JQuery,你可以这样做:
<script type="text/javascript">
$(function(){ $("#SomeText").val("");});
</script>
我不再使用Javascript,但我相信常规JS就像:
document.getElementById("SomeText").value = "";
(您可以在其中一个加载事件中执行此操作。
<body onload="...">
希望这有帮助。
答案 7 :(得分:0)
由于ViewData [“SomeText”]为空,我相当肯定textarea正在从引擎盖下的Request.Form中获取值。
答案 8 :(得分:0)
做s.th.像这样:
添加:
ModelState.Clear();
在提交按钮操作方法的return
语句之前。适合我。它可以为你工作。