Post后,Asp.Net MVC EditorTemplate模型丢失了

时间:2010-04-29 12:57:01

标签: c# asp.net-mvc asp.net-mvc-2 editortemplates

我有一个带有两个简单方法的控制器:

UserController 方法:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Details(string id)
{
 User user = UserRepo.UserByID(id);

 return View(user);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Details(User user)
{
 return View(user);
}

然后有一个简单的视图来显示细节:

<% using (Html.BeginForm("Details", "User", FormMethod.Post))
   {%>
 <fieldset>
  <legend>Userinfo</legend>
  <%= Html.EditorFor(m => m.Name, "LabelTextBoxValidation")%>
  <%= Html.EditorFor(m => m.Email, "LabelTextBoxValidation")%>
  <%= Html.EditorFor(m => m.Telephone, "LabelTextBoxValidation")%>
 </fieldset>
 <input type="submit" id="btnChange" value="Change" />
<% } %>

如您所见,我使用编辑器模板“LabelTextBoxValidation”:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%= Html.Label("") %>
<%= Html.TextBox(Model,Model)%>
<%= Html.ValidationMessage("")%>

显示用户信息没问题。该视图呈现完美的用户详细信息。 当我提交表单时,对象用户将丢失。我调试了行“return View(User);”在Post Details方法中,用户对象填充了可空值。如果我不使用编辑器模板,则用户对象将填充正确的数据。因此编辑器模板必定存在问题,但无法弄清楚它是什么。建议?

1 个答案:

答案 0 :(得分:1)

我会重新构建一下 - 将LabelTextBoxValidation编辑器更改为Html帮助程序,然后为您的数据模型创建一个EditorTemplate。这样你可以这样做:

<% using (Html.BeginForm("Details", "User", FormMethod.Post))
{%>
  <fieldset>
   <legend>Userinfo</legend>
   <% Html.EditorFor(m => m); %>
  </fieldset>
  <input type="submit" id="btnChange" value="Change" />
<% } %>

您的编辑器模板将类似于:

<%= Html.ValidatedTextBoxFor(m => m.Name); %>
<%= Html.ValidatedTextBoxFor(m => m.Email); %>
<%= Html.ValidatedTextBoxFor(m => m.Telephone); %>

ValidatedTextBoxFor是你的新html助手。为此,这将非常简单:

public static MvcHtmlString ValidatedTextBoxFor<T>(this HtmlHelper helper, Expression thingy)
{
     // Some pseudo code, Visual Studio isn't in front of me right now
     return helper.LabelFor(thingy) + helper.TextBoxFor(thingy) + helper.ValidationMessageFor(thingy);
}

这应该设置表格字段的名称我相信,因为这似乎是问题的根源。

编辑:以下代码可以帮助您:

public static MvcHtmlString ValidatedTextBoxFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
    return MvcHtmlString.Create(
           html.LabelFor(expression).ToString() +
           html.TextBoxFor(expression).ToString() +
           html.ValidationMessageFor(expression).ToString()
           );
}