Модель Asp.Net MVC EditorTemplate теряется после публикации - PullRequest
5 голосов
/ 29 апреля 2010

У меня есть контроллер с двумя простыми методами:

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 Ответ

1 голос
/ 29 апреля 2010

Я бы немного изменил архитектуру - измените ваш редактор 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()
           );
}
...