ASP.NET MVC模型绑定对我来说仍然是新手,我正试图弄清楚它是如何工作的。现在,我似乎遇到了Html.Textbox()
功能的问题具体来说,我有一个View,我将Html.Textbox设置为“Get”和“Post”中的值。它在“获取”中设置正常,但是在用户在“发布”期间提交值之后,我让类根据提交的其他值在内部更改其中一个值。
(我基本上是根据另一个来验证一个值......我不确定这是否是正确的方法......)
跟踪,我可以看到该值实际上已在模型和视图中按预期更改,但是当它在“发布”后显示在我的屏幕上时,该值不会显示为已更改。相反,它是最初设定的。
这是我的简化示例:
视图显示:
用户应从下拉列表中选择一个新值,然后单击“提交”。控制器中的“Post”方法从下拉列表中选取新值,并在“只读”文本框中更改“值”并重新显示。
(是的,我最终也会用JQuery做这个......)
这是我的示例Model类:
public class SampleSubmission
{
public string Name { get; set; }
public int Volume { get; set; }
public readonly SortedList<string, int> NameVolumeList = new SortedList<string, int>();
// Standard Constructor
public SampleSubmission()
{
NameVolumeList.Add("Sample1", 10);
NameVolumeList.Add("Sample2", 20);
NameVolumeList.Add("Sample3", 50);
NameVolumeList.Add("Other", 0);
this.Name = NameVolumeList.Keys[0];
this.Volume = NameVolumeList[Name];
}
// Copy Constructor
public SampleSubmission(SampleSubmission samSub) : this()
{
this.Name = samSub.Name;
this.Volume = NameVolumeList[Name];
}
}
这是控制器:
public class SampleSubmissionController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
SampleSubmission sampleSub = new SampleSubmission();
return View(sampleSub);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SampleSubmission sampleSub)
{
SampleSubmission samSub = new SampleSubmission(sampleSub);
return View(samSub);
}
}
这是视图:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<MvcModelBindTest.Models.SampleSubmission>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) { %>
<%= Html.DropDownList("Name", new SelectList(Model.NameVolumeList.Keys.ToList())) %>
<%= Html.TextBox("Volume",Model.Volume) %>
<input type="submit" name="pick" id="pick" value="Pick" /> <% } %>
</asp:Content>
关于为什么新值不显示的任何想法?
修改
为了解决问题,我阅读了“jfar”给出的链接并进行了一行更改。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SampleSubmission sampleSub)
{
SampleSubmission samSub = new SampleSubmission(sampleSub);
// Reset Model Value
ModelState.SetModelValue("Volume", new ValueProviderResult(
samSub.Volume, "", System.Globalization.CultureInfo.CurrentCulture));
return View(samSub);
}
这绝对有效。不幸的是,这对我来说感觉像是一个严重的黑客。如果我必须更新多个字段的值,该怎么办?必须有更好(更简单?)的方式来做到这一点。
EDIT2:找到我的答案。见下文......
答案 0 :(得分:1)
来自:How to clear textboxes defined with MVC HTML helpers
“HTMLHelper首先看一下 ModelState和ViewData看看是否有 值匹配他们的密钥然后 最后使用你提供的任何价值 它们。
如果您需要重置文本框 价值你还需要清除 ModelState条目与匹配 键。另一种选择是 改为重定向到同一页面 简单地通过渲染视图 javascript或MVC。
答案 1 :(得分:1)
当我偶然发现需要重置的另一个变量时,我想出了自己问题的答案。当我查看数据结构时,我意识到我想要的是原始状态,其中ModelState中没有键。
ModelState.Remove(key);
“key”是您尝试重置的值。
答案 2 :(得分:0)
另一个简单的解决方法是代替
<%= Html.TextBox("Volume",Model.Volume) %>
使用HTML输入标记
<input id="Volume" name ="Volume" value="@Model.Volume" />