2

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:找到我的答案。见下文...

4

3 回答 3

1

来自:如何清除使用 MVC HTML 助手定义的文本框

“HTMLHelper 首先查看 ModelState 和 ViewData 以查看是否有任何值与其键匹配,然后最终使用您提供的任何值。

如果您需要重置文本框的值,您还需要使用匹配键清除 ModelState 条目。另一种选择是重定向到同一页面,而不是简单地通过 javascript 或使用 MVC 呈现视图。

于 2010-09-22T16:02:02.993 回答
1

当我偶然发现另一个需要重置的变量时,我找到了自己问题的答案。当我查看数据结构时,我意识到我想要的是 ModelState 中没有 Key 的原始状态。

        ModelState.Remove(key);

其中“key”是您尝试重置的值。

于 2010-10-06T22:16:21.727 回答
0

另一个简单的解决方法是

<%= Html.TextBox("Volume",Model.Volume) %>

使用 HTML 输入标签

<input id="Volume" name ="Volume" value="@Model.Volume" />
于 2013-03-21T05:24:07.687 回答