【问题标题】:ASP.NET MVC2 -- Trouble with Model Binding and Html.Textbox()ASP.NET MVC2 - 模型绑定和 Html.Textbox() 的问题
【发布时间】:2010-09-22 15:28:44
【问题描述】:

ASP.NET MVC 模型绑定对我来说仍然是新事物,我正试图准确了解它是如何工作的。现在,我似乎遇到了 Html.Textbox() 的功能问题

具体来说,我有一个视图,我在其中将 Html.Textbox 设置为“Get”和“Post”中的值。它在“获取”中设置得很好,但是在用户在“发布”期间提交一个值之后,我让类根据提交的另一个值在内部更改其中一个值。

(我基本上是根据另一个值验证一个值...我不确定这是否是正确的方法...)

通过跟踪,我可以看到模型和视图中的值实际上已按预期更改,但是当它在“发布”之后显示在我的屏幕上时,该值不会显示为更改。相反,它是最初设置的。

这是我的简化示例:

视图显示:

  • 下拉列表中的项目(预选为“其他”)
  • 只读文本框(预加载值为 0)
  • 提交按钮

用户应从下拉菜单中选择一个新值并单击提交。控制器中的“Post”方法从下拉列表中获取新值,并更改只读文本框中的值并重新显示。

(是的,我最终也会用 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:找到了我的答案。见下文...

【问题讨论】:

标签: asp.net-mvc validation asp.net-mvc-2 model-binding html.textbox


【解决方案1】:

发件人:How to clear textboxes defined with MVC HTML helpers

"HTMLHelper 的第一次看 ModelState 和 ViewData 看看有没有 值匹配它们的键,然后 最后使用你提供的任何价值 他们。

如果您需要重置文本框的 值你还需要清除 具有匹配项的 ModelState 条目 钥匙。另一种选择是 而是重定向到同一页面 简单地通过渲染视图 javascript 或使用 MVC。

【讨论】:

  • 是的,新的价值观——这正是我想要做的。我阅读了用户“Cynthia”给出的链接和答案。我解决了这个问题并在上面提到了它,但我不喜欢它是如何发生的。感觉就像是黑客攻击。
  • @TheVillageIdiot,好吧,虽然概念是一样的。 @Pretzel,您在保留状态时可能会利用此功能。编写自己的 HTML 助手也很容易。很确定你也可以用谷歌搜索现有的库。
【解决方案2】:

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

        ModelState.Remove(key);

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

【讨论】:

    【解决方案3】:

    另一个简单的解决方法是代替

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

    使用 HTML 输入标签

    <input id="Volume" name ="Volume" value="@Model.Volume" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多