Модель Editortemplate ASP.NET MVC теряется после сообщения
-
02-10-2019 - |
Вопрос
У меня есть контроллер с двумя простыми методами:
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("")%>
Отображение информации о пользователе нет проблем. Вид оказывает прекрасно детали пользователей. Когда я отправляю форму, пользователь объекта теряется. Я отлажил на ряд "Вернуться View (Пользователь);" В методе после подробной информации пользовательский объект заполнен ненугими значениями. Если я не использую шаблон редактора, пользовательский объект заполнен правильными данными. Таким образом, должно быть что-то не так с шаблоном редактора, но не может выяснить, что это такое. Предложения?
Решение
Я бы повторю архитехник немного - измените редактор вашей LabeltextBoxValidation на HTML-помощник, а затем сделайте одно редактирование для вашей модели данных. Таким образом, вы могли бы сделать что-то вроде этого:
<% 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); %>
Откуда ValidateTextBoxFor - ваш новый HTML Helper. Чтобы сделать это, было бы довольно легко:
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()
);
}