【问题标题】:TextBox Value gets blank on Submit提交时文本框值变为空白
【发布时间】:2012-10-18 17:39:19
【问题描述】:

我通过选择 (ASP.Net MVC 2 Web Application) 在 MVC2 中创建了一个应用程序。这提供了一些 Home/About Controllers/Models/Views。

我另外创建了一个具有如下索引名称的模型...

namespace MvcApplication1.Models
{
    public class Index
    {
        [DataType(DataType.Text)]
        public String Name { get; set; }
    }
}

以下是我的索引视图

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm()) 
        {%>
    <%:Html.TextBoxFor(x=> x.Name) %>
    <input type="submit" name="Click here" />
    <%} %>
</asp:Content>

下面是我的控制器

[HttpPost]
public ActionResult Index(Index Model)
{
      ViewData["Message"] = "Welcome to ASP.NET MVC!";
      return View();
}

问题

当我保持索引控制器如下所示。如果我点击提交按钮。这是清除 TextBox 控件。如下所示

    public ActionResult Index()
    {
          ViewData["Message"] = "Welcome to ASP.NET MVC!";
          return View();
    }

如果将模型作为参数合并到动作方法中,文本框将不会被清除...

这种行为的原因是什么?

【问题讨论】:

  • 没有得到问题...你想做什么?什么不工作?
  • @gdoron - 如您所知,我们在 ASP.Net 中有 ViewState,用于在 PostBack 后保留 TextBox 中的数据。对?但是 MVC 是无状态的。我希望在 MVC 的文本框中保留数据。实际上我是 MVC 的新手。您能否解释一下 MVC 在包含模型参数后如何在 PostBack 后保留文本框中的数据?

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

MVC 不像 WebForms 那样维护回发之间的状态。

从 ModelState 中的值重新填充字段,这些值仅在模型绑定器在回发时看到时才添加到那里(并且可能仅在存在验证错误的情况下?)。老实说,如果它不自动执行,我几乎会更喜欢。但是,如果你回发一个无效值(例如,一个字符串到一个整数字段),你需要一个可以存储无效值的地方,以便它可以与验证错误一起重新填充。

除了自动方法,您需要手动将模型传回视图以填充它

[HttpPost]
public ActionResult Index(Index Model)
{
  ViewData["Message"] = "Welcome to ASP.NET MVC!";
  return View(Model);
}

【讨论】:

  • 那么我可以在 Model 中为 Property 键入 [Required] 吗?我可以让它自动重新填充吗?
  • 不,动作实际上必须接受一个带有属性的模型。
  • 看不懂...请解释一下。
  • @testing 这个关键(如果我正确理解你在问什么)是你发布的代码:return View();不向视图传递任何内容,从而导致您的“空白”文本框。而贝蒂的代码:return View(model);确实将数据传递给视图,从而允许 TextboxFor 调用的模型绑定工作。
  • Betty 和@Forty-Two 只有在 Action 方法中添加 Model State 参数后,我才会重新填充 TextBox。不将其传递给View
【解决方案2】:

您的控制器应如下所示,以便用户输入在单击提交按钮后保留在视图中'

public ActionResult Index( )
{
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    var model = new Index();
    return View( model );
}

[HttpPost]
public ActionResult Index(Index model )
{

    return View(model);
}

【讨论】:

  • 不,尝试从视图参数中删除模型并使其像这样return View(); 它会起作用。
  • 还有为什么[HttpPost] 应该包含在操作中...?因为我要提交表格?即使没有这行代码,表单提交也很好。不是吗?还是我错过了什么?
  • 你能否给出一个非常简短的答案,我为什么要使用HttpPost。因为没有它就提交。谢谢你的文章。我一定会经历的……
  • HttpPost 指定 Index 方法的重载只能为 POST 请求调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多