سؤال

إذا قمت بتمرير HtmlAttributes إلى قالب، مثل هذا:

@Html.DisplayFor(m => m.FirstName, new { htmlAttributes = new { @class = "orangetxt strongtxt" } })

في القالب الخاص بي، كيف يمكنني إدخال هذه العناصر في HTML الخاص بي:

<span @ViewData["htmlAttributes"]>@Model</span>

يعمل هذا تقريبًا، لكنه يفعل بعض الأشياء الغريبة جدًا، لذلك أفترض أن هذا ليس هو الطريق الصحيح.

أدرك أنه يمكنني تحقيق ذلك باستخدام طريقة ملحق HtmlHelper لعرض عنصر HTML كاملاً (امتداد، في هذه الحالة) وتمرير السمات بهذه الطريقة، ولكن هل هناك طريقة لعرض السمات مباشرة في عنصر HTML، مثل ما ورد أعلاه مثال؟

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

المحلول

وأدناه تمديد طريقة تسمح لي لتحويل HtmlAttributes إلى سلسلة:

    public static MvcHtmlString RenderHtmlAttributes<TModel>(
        this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
    {
        var attrbituesDictionary = new RouteValueDictionary(htmlAttributes);

        return MvcHtmlString.Create(String.Join(" ", 
            attrbituesDictionary.Select(
                item => String.Format("{0}=\"{1}\"", item.Key, 
                htmlHelper.Encode(item.Value)))));
    }

وبعد ذلك، لجعلها ضمن العلامة، أنا يمكن أن تفعل هذا:

<span @Html.RenderHtmlAttributes(ViewData["htmlAttributes"])>@Model</span>

نصائح أخرى

إجابة جراد روز جيدة، لكنني واجهت مشكلتين معها:

  • ولا يقوم بتحويل الشرطات السفلية إلى شرطات في أسماء السمات
  • لا يتعامل مع السمات عديمة القيمة بأمان

لمعالجة المشكلة الأولى، استخدم HtmlHelper.AnonymousObjectToHtmlAttributes.

فيما يلي تعديلي لطريقة جراد:

public static MvcHtmlString RenderHtmlAttributes(this HtmlHelper helper, object htmlAttributes)
{
        if (htmlAttributes == null) return new MvcHtmlString(String.Empty);
        var attrbituesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        return new MvcHtmlString(String.Join(" ", attrbituesDictionary.Select(item => string.IsNullOrEmpty((string)item.Value) ? String.Format("{0}", item.Key) : String.Format("{0}=\"{1}\"", item.Key, helper.Encode(item.Value)))));
}

وهذه محاولة وبدلا من ذلك،

@Html.DisplayFor(m => m.FirstName, 
                 new { htmlAttributes = "class = orangetxt strongtxt"})

وهذا سيجعل سلسلة، في حين أن الإصدار لم تفعل أشياء غريبة، أصدرت { } كجزء من الإخراج.

ويستخدم DisplayFor() لتقديم قالب يطابق نوع العقار.

وقوالب العرض هي ملفات .cshtml داخل <م> / DisplayTemplates المجلد الذي بدوره هو داخل مجلد عرض (أي أي مجلد من المنزل، المشتركة أو حتى وحدة تحكم محددة).

مثال.

إذا كنت قد ل<م> String.cshtml قالب مثل هذا داخل <م> / المشاهدات / المشتركة :

@model String

@if (string.IsNullOrEmpty(Model)) {
   <span>(no string)</span>
}
else {
   <span>@Model</span>
}

وفي كل مرة تتصل DisplayFor() لخاصية سلسلة:

DisplayFor(model => model.MyStringProperty);

وويجعل القالب وفقا لقيمة سلسلة ل. يمكنك أن تكون أكثر تحديدا وضعت <م> / DisplayTemplates داخل مجلد خاص عرض ومنهم يدعو فقط من تتأثر تلك الآراء بواسطة القالب.


في قضيتك يمكنك أن تكون أكثر تحديدا وحتى DisplayFor() مكالمة باستخدام قالب معين.

لنفترض أنك قمت قالب لخاصية معينة، ودعا MyPropertyTemplate.cshtml. هل ندعو DisplayFor() مثل هذا:

DisplayFor(model => model.MyProperty, "MyPropertyTemplate");

ولهم، داخل هذا القالب الذي يمكن أن يكون مهما HTML سمات تريد.

@model MyProperty

<span class="orangetxt strongtxt">@MyProperty.ToString()</span>

وPS: عندما لا تجد قالب واعتقد انه يدعو فقط model.Property.ToString() دون أتش تي أم أل إضافي

وFYI: EditorFor()، على سبيل المثال، يعمل بطريقة مشابهة ولكنه يستخدم <م> / EditorTemplates مجلد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top