يتم فقد نموذج ASP.NET MVC EditorTemplate بعد المنشور
-
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("")%>
إظهار معلومات المستخدم ليست مشكلة. العرض يجعل تفاصيل المستخدم تمامًا. عندما أقوم بإرسال النموذج ، يتم فقدان مستخدم الكائن. قمت بتصحيح الأخطاء على الصف "عرض الإرجاع (المستخدم) ؛" في طريقة تفاصيل المنشور ، يتم ملء كائن المستخدم بقيم قابلة للإلغاء. إذا لم أستخدم قالب المحرر ، فسيتم ملء كائن المستخدم بالبيانات الصحيحة. لذلك يجب أن يكون هناك شيء خاطئ في قالب المحرر ، لكن لا يمكنك معرفة ما هو عليه. اقتراحات؟
المحلول
أود إعادة المهندسة المعمارية قليلاً - قم بتغيير محرر LabelTextBoxValidation إلى HTML Helper ، ثم قم بإجراء تحرير واحد لنموذج البيانات الخاص بك. بهذه الطريقة يمكنك أن تفعل شيئًا كهذا:
<% 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); %>
حيث تم التحقق من صحة TextBoxfor هو مساعد 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()
);
}