ASP.NET MVC2 - 模型绑定和Html.Textbox()的麻烦

时间:2010-09-22 15:28:45

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

ASP.NET MVC模型绑定对我来说仍然是新手,我正试图弄清楚它是如何工作的。现在,我似乎遇到了Html.Textbox()

功能的问题

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

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

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

这是我的简化示例:

视图显示:

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

用户应从下拉列表中选择一个新值,然后单击“提交”。控制器中的“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:找到我的答案。见下文......

3 个答案:

答案 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" />