سؤال

أنا حاليا ببناء نهاية المشرف الخلفي لموقع الويب في ASP.NET MVC.

في تطبيق ASP.NET MVC، بدأت في استخدام طريقة المساعد "Editorfor" مثل ذلك:

<div id="content-edit" class="data-form">
    <p>
        <%= Html.LabelFor(c => c.Title) %>
        <%= Html.TextBoxFor(c => c.Title)%>
    </p>
    <p>
        <%= Html.LabelFor(c => c.Biography) %>
        <%= Html.EditorFor(c => c. Biography)%>
    </p>
</div>

في النموذج، تم تزيين حقل "السيرة الذاتية" مع: [UiHelper ("HTML")].

لدي عرض جزئي "HTML" (ضمن المشاهدات / المشتركة / EditectorEmates):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>

<textarea class="html">
    <%= Model.ToString() %>
</textarea>

الآن أود الحصول على سمة "المعرف" التي تم تعيينها "Textarea" على اسم الحقل، مثل هذا:

<textarea id="Biography" class="html">
    ...
</textarea>

لكنني لا أستطيع أن أرى طريقة للقيام بذلك مع الإعداد الحالي.

كل ما يمكنني التفكير فيه هو إنشاء ViewModel "HTML" يحتوي على خاصية "قيمة" وخاصية "تحكم".

ولكن إذا كنت استنزاف العرض، بدلا من "system.xml.linq.xelement"، فلن يكون ذلك متوافقا مع طريقة المساعدة "Editorfor" وعلي أن أفعل كل شيء يدويا.

هل كان لدى أي شخص مشكلة مماثلة حتى الآن؟

هل كانت مفيدة؟

المحلول

يجب أن تكون قادرا على سحب المعرف المطلوب من خاصية ViewData.templateInfo.htmlfieldprefix للعرض. مثله:

<%@ Control Language="C#"
      Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
    <%= Model.ToString() %>
</textarea>

لإظهار سبب تشغيل هذا المكان، إليك المكان الموجود في TemplateHelpers.cs (من مصدر المعاينة 1 MVC2) حيث يتم تهيئة ViewData لعنصر تحكم قالب المحرر:

ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) {
    Model = modelValue,
    TemplateInfo = new TemplateInfo {
        FormattedModelValue = formattedModelValue,
        ModelType = modelType,
        HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression),
        IsNullableValueType = (underlyingNullableType != null),
    }
};

في المكالمة أعلاه، تتم تهيئة "التعبير" (أبعد من مكدس المكالمات) باسم الخاصية التي يتم تحريرها.

BTW، sperling أدناه اشتعلت التفاصيل التي فاتني أصلا: إذا كنت تستخدم (أو قد تستخدم) غير افتراضية HtmlHelper.IdAttributeDotReplacement, ، ثم سوف ترغب في استبدال النقاط في HtmlPrefix الممتلكات مع HtmlHelper.IdAttributeDotReplacement.

نصائح أخرى

تم استخدام هذا لإنشاء معرف (مع بادئة نموذج). تخطي .Replace () الجزء إذا كنت تريد سمة الاسم.

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>

في حالتنا كان علينا استخدامها Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName مع ExpressionHelper.GetExpressionText

والتي في الحلاقة تستخدم مثل هذا:

           // hiddenFor was caching the value of this html input, and the value alone, nothing else on the page!
            Expression<Func<Web.ViewModels.ApiSettingsViewModel, int>> expression = (m => m.OrgApiLoginCredentials[i].OrgApiLoginId); 
        }
        <input type="hidden" value="@Model.OrgApiLoginCredentials[i].OrgApiLoginId" name="@Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression))" class="data-org-api-login-id"/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top