ASP.NET MVC 模型绑定对我来说仍然是新事物,我正试图准确了解它是如何工作的。现在,我似乎遇到了 Html.Textbox() 的功能问题
具体来说,我有一个视图,我将 Html.Textbox 设置为“Get”和“Post”中的值。它在“获取”中设置得很好,但是在用户在“发布”期间提交一个值之后,我让类根据提交的另一个值在内部更改其中一个值。
(我基本上是根据另一个值来验证一个值......我不确定这是否是正确的方法......)
通过跟踪,我可以看到模型和视图中的值实际上已按预期更改,但是当它在“发布”之后显示在我的屏幕上时,该值不会显示为更改。相反,它是最初设置的。
这是我的简化示例:
视图显示:
- 下拉列表中的项目(预选为“其他”)
- 一个只读文本框(预加载值为 0)
- 提交按钮
用户应从下拉列表中选择一个新值并单击提交。控制器中的“发布”方法从下拉列表中获取新值并更改只读文本框中的值并重新显示。
(是的,我最终也会用 JQuery 来做这件事……)
这是我的示例模型类:
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”给出的链接并进行了 1 行更改。
[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:找到我的答案。见下文...