Переключить функцию на & lt; a & gt; в cshtml не работает [дубликат]

a ~ li {
    background: red
}

В css3 добавлен новый селектор, поэтому, если html выглядит так:

<ul>
  <li>
    <a>Some text</a>
  </li>
</ul>

Фактически вы можете воздействовать на родителя элемента «a», который является «li» «

287
задан niico 28 October 2016 в 14:20
поделиться

23 ответа

Из решений в этой нити я придумал следующее, вероятно, сверхсложное решение, которое позволяет вам отложить рендеринг любых html (скриптов) в блоке использования.

ИСПОЛЬЗОВАНИЕ

Создайте «раздел»

  1. Типичный сценарий: В частичном представлении включайте только блок один раз, независимо от того, сколько раз частичное просмотр повторяется на странице:
    @using (Html.Delayed(isOnlyOne: "some unique name for this section")) {
        <script>
            someInlineScript();
        </script>
    }
    
  2. В частичном представлении включите блок для каждого использования частичного использования:
    @using (Html.Delayed()) {
        <b>show me multiple times, @Model.Whatever</b>
    }
    
  3. В частичном представлении включить только блок один раз, независимо от того, сколько раз частичное повторяется, но позже выведите его конкретно по имени when-i-call-you:
    @using (Html.Delayed("when-i-call-you", isOnlyOne: "different unique name")) {
        <b>show me once by name</b>
        <span>@Model.First().Value</span>
    }
    

Отметьте «разделы»

(т.е. отобразить задержанную секцию в родительском представлении)

@Html.RenderDelayed(); // writes unnamed sections (#1 and #2, excluding #3)
@Html.RenderDelayed("when-i-call-you", false); // writes the specified block, and ignore the `isOnlyOne` setting so we can dump it again
@Html.RenderDelayed("when-i-call-you"); // render the specified block by name
@Html.RenderDelayed("when-i-call-you"); // since it was "popped" in the last call, won't render anything due to `isOnlyOne` provided in `Html.Delayed`

CODE

public static class HtmlRenderExtensions {

    /// <summary>
    /// Delegate script/resource/etc injection until the end of the page
    /// <para>@via https://stackoverflow.com/a/14127332/1037948 and http://jadnb.wordpress.com/2011/02/16/rendering-scripts-from-partial-views-at-the-end-in-mvc/ </para>
    /// </summary>
    private class DelayedInjectionBlock : IDisposable {
        /// <summary>
        /// Unique internal storage key
        /// </summary>
        private const string CACHE_KEY = "DCCF8C78-2E36-4567-B0CF-FE052ACCE309"; // "DelayedInjectionBlocks";

        /// <summary>
        /// Internal storage identifier for remembering unique/isOnlyOne items
        /// </summary>
        private const string UNIQUE_IDENTIFIER_KEY = CACHE_KEY;

        /// <summary>
        /// What to use as internal storage identifier if no identifier provided (since we can't use null as key)
        /// </summary>
        private const string EMPTY_IDENTIFIER = "";

        /// <summary>
        /// Retrieve a context-aware list of cached output delegates from the given helper; uses the helper's context rather than singleton HttpContext.Current.Items
        /// </summary>
        /// <param name="helper">the helper from which we use the context</param>
        /// <param name="identifier">optional unique sub-identifier for a given injection block</param>
        /// <returns>list of delayed-execution callbacks to render internal content</returns>
        public static Queue<string> GetQueue(HtmlHelper helper, string identifier = null) {
            return _GetOrSet(helper, new Queue<string>(), identifier ?? EMPTY_IDENTIFIER);
        }

        /// <summary>
        /// Retrieve a context-aware list of cached output delegates from the given helper; uses the helper's context rather than singleton HttpContext.Current.Items
        /// </summary>
        /// <param name="helper">the helper from which we use the context</param>
        /// <param name="defaultValue">the default value to return if the cached item isn't found or isn't the expected type; can also be used to set with an arbitrary value</param>
        /// <param name="identifier">optional unique sub-identifier for a given injection block</param>
        /// <returns>list of delayed-execution callbacks to render internal content</returns>
        private static T _GetOrSet<T>(HtmlHelper helper, T defaultValue, string identifier = EMPTY_IDENTIFIER) where T : class {
            var storage = GetStorage(helper);

            // return the stored item, or set it if it does not exist
            return (T) (storage.ContainsKey(identifier) ? storage[identifier] : (storage[identifier] = defaultValue));
        }

        /// <summary>
        /// Get the storage, but if it doesn't exist or isn't the expected type, then create a new "bucket"
        /// </summary>
        /// <param name="helper"></param>
        /// <returns></returns>
        public static Dictionary<string, object> GetStorage(HtmlHelper helper) {
            var storage = helper.ViewContext.HttpContext.Items[CACHE_KEY] as Dictionary<string, object>;
            if (storage == null) helper.ViewContext.HttpContext.Items[CACHE_KEY] = (storage = new Dictionary<string, object>());
            return storage;
        }


        private readonly HtmlHelper helper;
        private readonly string identifier;
        private readonly string isOnlyOne;

        /// <summary>
        /// Create a new using block from the given helper (used for trapping appropriate context)
        /// </summary>
        /// <param name="helper">the helper from which we use the context</param>
        /// <param name="identifier">optional unique identifier to specify one or many injection blocks</param>
        /// <param name="isOnlyOne">extra identifier used to ensure that this item is only added once; if provided, content should only appear once in the page (i.e. only the first block called for this identifier is used)</param>
        public DelayedInjectionBlock(HtmlHelper helper, string identifier = null, string isOnlyOne = null) {
            this.helper = helper;

            // start a new writing context
            ((WebViewPage)this.helper.ViewDataContainer).OutputStack.Push(new StringWriter());

            this.identifier = identifier ?? EMPTY_IDENTIFIER;
            this.isOnlyOne = isOnlyOne;
        }

        /// <summary>
        /// Append the internal content to the context's cached list of output delegates
        /// </summary>
        public void Dispose() {
            // render the internal content of the injection block helper
            // make sure to pop from the stack rather than just render from the Writer
            // so it will remove it from regular rendering
            var content = ((WebViewPage)this.helper.ViewDataContainer).OutputStack;
            var renderedContent = content.Count == 0 ? string.Empty : content.Pop().ToString();
            // if we only want one, remove the existing
            var queue = GetQueue(this.helper, this.identifier);

            // get the index of the existing item from the alternate storage
            var existingIdentifiers = _GetOrSet(this.helper, new Dictionary<string, int>(), UNIQUE_IDENTIFIER_KEY);

            // only save the result if this isn't meant to be unique, or
            // if it's supposed to be unique and we haven't encountered this identifier before
            if( null == this.isOnlyOne || !existingIdentifiers.ContainsKey(this.isOnlyOne) ) {
                // remove the new writing context we created for this block
                // and save the output to the queue for later
                queue.Enqueue(renderedContent);

                // only remember this if supposed to
                if(null != this.isOnlyOne) existingIdentifiers[this.isOnlyOne] = queue.Count; // save the index, so we could remove it directly (if we want to use the last instance of the block rather than the first)
            }
        }
    }


    /// <summary>
    /// <para>Start a delayed-execution block of output -- this will be rendered/printed on the next call to <see cref="RenderDelayed"/>.</para>
    /// <para>
    /// <example>
    /// Print once in "default block" (usually rendered at end via <code>@Html.RenderDelayed()</code>).  Code:
    /// <code>
    /// @using (Html.Delayed()) {
    ///     <b>show at later</b>
    ///     <span>@Model.Name</span>
    ///     etc
    /// }
    /// </code>
    /// </example>
    /// </para>
    /// <para>
    /// <example>
    /// Print once (i.e. if within a looped partial), using identified block via <code>@Html.RenderDelayed("one-time")</code>.  Code:
    /// <code>
    /// @using (Html.Delayed("one-time", isOnlyOne: "one-time")) {
    ///     <b>show me once</b>
    ///     <span>@Model.First().Value</span>
    /// }
    /// </code>
    /// </example>
    /// </para>
    /// </summary>
    /// <param name="helper">the helper from which we use the context</param>
    /// <param name="injectionBlockId">optional unique identifier to specify one or many injection blocks</param>
    /// <param name="isOnlyOne">extra identifier used to ensure that this item is only added once; if provided, content should only appear once in the page (i.e. only the first block called for this identifier is used)</param>
    /// <returns>using block to wrap delayed output</returns>
    public static IDisposable Delayed(this HtmlHelper helper, string injectionBlockId = null, string isOnlyOne = null) {
        return new DelayedInjectionBlock(helper, injectionBlockId, isOnlyOne);
    }

    /// <summary>
    /// Render all queued output blocks injected via <see cref="Delayed"/>.
    /// <para>
    /// <example>
    /// Print all delayed blocks using default identifier (i.e. not provided)
    /// <code>
    /// @using (Html.Delayed()) {
    ///     <b>show me later</b>
    ///     <span>@Model.Name</span>
    ///     etc
    /// }
    /// </code>
    /// -- then later --
    /// <code>
    /// @using (Html.Delayed()) {
    ///     <b>more for later</b>
    ///     etc
    /// }
    /// </code>
    /// -- then later --
    /// <code>
    /// @Html.RenderDelayed() // will print both delayed blocks
    /// </code>
    /// </example>
    /// </para>
    /// <para>
    /// <example>
    /// Allow multiple repetitions of rendered blocks, using same <code>@Html.Delayed()...</code> as before.  Code:
    /// <code>
    /// @Html.RenderDelayed(removeAfterRendering: false); /* will print */
    /// @Html.RenderDelayed() /* will print again because not removed before */
    /// </code>
    /// </example>
    /// </para>

    /// </summary>
    /// <param name="helper">the helper from which we use the context</param>
    /// <param name="injectionBlockId">optional unique identifier to specify one or many injection blocks</param>
    /// <param name="removeAfterRendering">only render this once</param>
    /// <returns>rendered output content</returns>
    public static MvcHtmlString RenderDelayed(this HtmlHelper helper, string injectionBlockId = null, bool removeAfterRendering = true) {
        var stack = DelayedInjectionBlock.GetQueue(helper, injectionBlockId);

        if( removeAfterRendering ) {
            var sb = new StringBuilder(
#if DEBUG
                string.Format("<!-- delayed-block: {0} -->", injectionBlockId)
#endif
                );
            // .count faster than .any
            while (stack.Count > 0) {
                sb.AppendLine(stack.Dequeue());
            }
            return MvcHtmlString.Create(sb.ToString());
        } 

        return MvcHtmlString.Create(
#if DEBUG
                string.Format("<!-- delayed-block: {0} -->", injectionBlockId) + 
#endif
            string.Join(Environment.NewLine, stack));
    }


}
202
ответ дан Community 18 August 2018 в 05:24
поделиться
  • 1
    Но что, если сценарий очень специфичен для частичного? Разве это не имеет логического смысла для определения его в частичном, а не в представлении? – Jez 25 October 2012 в 15:57
  • 2
    Почему это по дизайну? – Shimmy 26 November 2012 в 12:12
  • 3
    @Darin: Я не согласен. Как насчет принципа СУХОЙ? Я не люблю повторять себя, даже если это только ссылки на сценарии. – fretje 7 December 2012 в 17:56
  • 4
    @fretje, каждый имеет право высказать свое мнение по этой теме. Я уважаю твое. В своем ответе я высказал свое мнение и связался с ответом, который позволит вам выполнить эту задачу. Но я также подчеркнул, что я бы рекомендовал и сделал для этой ситуации. – Darin Dimitrov 7 December 2012 в 18:41
  • 5
    прикомандирование @JoshNoe, а остальное - "виджет" (отображение + богатое взаимодействие) - прекрасный пример частичного представления, тесно связанного с связанным javascript. По дизайну мне не нужно писать два оператора include в разных местах, чтобы получить полную функциональность, потому что дисплей никогда не будет без сопутствующего взаимодействия, и взаимодействие никогда не появится в другом месте. – drzaus 12 September 2013 в 19:51
  • 6
    Ничего себе, мне даже сложно понять код, но +1 для решения проблемы – Rameez Ahmed Sayad 19 October 2014 в 22:53
  • 7
    @RameezAhmedSayad, вы правы - вернусь сюда, даже я смущен тем, как я хотел сказать, как его использовать. Обновление ответа ... – drzaus 14 August 2015 в 17:23
  • 8
    И пояснить далее - причина состоит в двух «именах». заключается в том, что если вы хотите, чтобы он отображался только после того, как ему нужен уникальный ключ в параметре isOnlyOne, но только если вы хотите отобразить его в определенном месте по имени, вы предоставляете идентификатор, иначе он будет сброшен в Html.RenderDelayed(). – drzaus 14 August 2015 в 17:46
  • 9
    Я лично не думаю, что есть необходимость в покупке проблемы и использовании этого подхода, раздел в частичных представлениях просто не нужен, поскольку его можно устранить, и скрипты могут идти туда без указания раздела. Это потому, что это внешне визуализировано, и если вы видите код для отображаемой страницы, вы просто замечаете, что код для частичного представления там не отображается. Так что если это вопрос лучшей организации и т. Д., Это не будет иметь никакого эффекта. – Transcendent 28 December 2015 в 16:01
  • 10
    @Transcendent & quot; debate & quot; уже начато в комментариях к принятому ответу stackoverflow.com/a/7556594/1037948 – drzaus 28 December 2015 в 17:08
203
ответ дан Community 6 September 2018 в 19:35
поделиться
207
ответ дан Community 30 October 2018 в 01:03
поделиться

Цель OP состоит в том, что он хочет определить встроенные скрипты в свой Partial View, который я предполагаю, что этот скрипт специфичен только для этого Partial View и включает этот блок в его секцию скриптов.

Я понимаю, что он хочет, чтобы Partial View был автономным. Идея аналогична компонентам при использовании Angular.

Моим способом было бы просто сохранить скрипты внутри Partial View как есть. Теперь проблема в том, что при вызове Partial View он может выполнять скрипт там перед всеми другими скриптами (который обычно добавляется к нижней части страницы макета). В этом случае у вас есть сценарий Partial View, ожидающий других скриптов. Есть несколько способов сделать это. Простейший, который я использовал ранее, использует событие на body.

В моем макете у меня было бы что-то внизу:

// global scripts
<script src="js/jquery.min.js"></script>
// view scripts
@RenderSection("scripts", false)
// then finally trigger partial view scripts
<script>
  (function(){
    document.querySelector('body').dispatchEvent(new Event('scriptsLoaded'));
  })();
</script>

Затем в моем частичном представлении (внизу):

<script>
  (function(){
    document.querySelector('body').addEventListener('scriptsLoaded', function() {

      // .. do your thing here

    });
  })();
</script>

Другое решение - использовать стек, чтобы выталкивать все ваши скрипты и вызывать каждого в конце. Другим решением, как уже упоминалось, является шаблон RequireJS / AMD, который также отлично работает.

0
ответ дан alans 18 August 2018 в 05:24
поделиться

Следуя принципу ненавязчивого , не обязательно, чтобы «_myPartial» вводил контент непосредственно в секцию скриптов. Вы можете добавить эти сценарии частичного просмотра в отдельный файл .js и ссылаться на них в раздел @scripts из родительского представления.

8
ответ дан archil 18 August 2018 в 05:24
поделиться
  • 1
    Что произойдет, если частичное представление вообще не отображается на странице? До сих пор ли мы ссылаемся на эти .js-файлы в родительском и перегружаем? – Murali Murugesan 10 February 2013 в 19:15

Используя Mvc Core, вы можете создать аккуратный TagHelper scripts, как показано ниже. Это можно легко превратить в тэг section, где вы также дадите ему имя (или имя берется из производного типа). Обратите внимание на то, что для IHttpContextAccessor необходимо настроить инъекцию зависимостей.

При добавлении скриптов (например, в частичном)

<scripts>
    <script type="text/javascript">
        //anything here
    </script>
</scripts>

При выводе сценариев (например, в файле макета)

<scripts render="true"></scripts>

Код

public class ScriptsTagHelper : TagHelper
    {
        private static readonly object ITEMSKEY = new Object();

        private IDictionary<object, object> _items => _httpContextAccessor?.HttpContext?.Items;

        private IHttpContextAccessor _httpContextAccessor;

        public ScriptsTagHelper(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            var attribute = (TagHelperAttribute)null;
            context.AllAttributes.TryGetAttribute("render",out attribute);

            var render = false;

            if(attribute != null)
            {
                render = Convert.ToBoolean(attribute.Value.ToString());
            }

            if (render)
            {
                if (_items.ContainsKey(ITEMSKEY))
                {
                    var scripts = _items[ITEMSKEY] as List<HtmlString>;

                    var content = String.Concat(scripts);

                    output.Content.SetHtmlContent(content);
                }
            }
            else
            {
                List<HtmlString> list = null;

                if (!_items.ContainsKey(ITEMSKEY))
                {
                    list = new List<HtmlString>();
                    _items[ITEMSKEY] = list;
                }

                list = _items[ITEMSKEY] as List<HtmlString>;

                var content = await output.GetChildContentAsync();

                list.Add(new HtmlString(content.GetContent()));
            }
        }
    }
0
ответ дан BlackjacketMack 18 August 2018 в 05:24
поделиться

Ну, я полагаю, что другие плакаты предоставили вам средства для непосредственного включения @section в ваш частичный (с помощью сторонних помощников html).

Но, я считаю, что если ваш скрипт тесно связан с вашим частичным, просто поместите свой javascript непосредственно внутри встроенного тега <script> в пределах вашего частичного и сделайте с ним (просто будьте осторожны с дублированием скрипта, если вы намерены использовать частичное более одного раза в одном представлении);

-1
ответ дан Daffy Punk 18 August 2018 в 05:24
поделиться
  • 1
    Обычно это не идеально, потому что загрузка jQuery и т. Д. Произойдет после встроенных скриптов ... но для собственного кода я думаю, что это нормально. – Worthy7 2 August 2016 в 00:58

Это довольно популярный вопрос, поэтому я опубликую свое решение. У меня была та же проблема, и хотя она не идеальна, я думаю, что она работает очень хорошо и не делает частичную зависимость от представления. Мой сценарий состоял в том, что действие было доступно самому, но также могло быть встроено в aa view - google map.

В моем _layout у меня есть:

@RenderSection("body_scripts", false)

В моем index view У меня есть:

@Html.Partial("Clients")
@section body_scripts
{
    @Html.Partial("Clients_Scripts")
}

В моем представлении clients у меня есть (все карта и ассоциативный html):

@section body_scripts
{
    @Html.Partial("Clients_Scripts")
}

Мой Clients_Scripts вид содержит javascript, который будет отображаться на странице

Таким образом, мой сценарий изолирован и может быть отображен на странице, где это необходимо, причем тэг body_scripts отображается только в первом вхождении, что механизм просмотра бритвы находит это.

Это позволяет мне все разделять - это решение, которое хорошо работает для меня, у других могут быть проблемы с ним, но он исправляет дыры «по дизайну».

73
ответ дан dan richardson 18 August 2018 в 05:24
поделиться
  • 1
    вопрос, почему голосующий кто-нибудь это сделал? Если вы голосуете, вы действительно должны объяснить, почему. – dan richardson 25 June 2014 в 12:10
  • 2
    Я не был тем, кто проголосовал за вас, но я скажу, что мне не очень нравится это решение, потому что оно все еще отделяет сценарии просмотра от самого представления. – crush 13 February 2015 в 02:19
  • 3
    20 других людей, и у меня другое мнение. Вы все равно можете иметь сценарии, напрямую связанные с представлением, находящимся в отдельном файле, это ошибка программирования, если вы не включаете свой сценарий вместе с вашим представлением. Наличие в отдельном файле разделяет взаимодействие с презентацией и позволяет использовать другие преимущества от него в отдельном файле. – dan richardson 13 February 2015 в 10:15
  • 4
    Вы совершенно правы. Я полностью согласен и предпочитаю этот метод лично. Реальная проблема для меня в том, что мои коллеги борются с этим большим разделением. Это проблема с доменом. Я думаю, что этот метод идеален, особенно когда вы учитываете процесс сборки JavaScript. Я продолжу работу по обучению своих коллег использованию этого метода и его полной поддержке. Тем не менее, я думаю, что ваш ответ может быть улучшен. Вам не нужно было упоминать, что «20 человек согласны». хоть. Просто потому, что ответ популярен, не всегда означает, что он прав. В этом случае это правильно. – crush 13 February 2015 в 17:08
  • 5
    Это решение обладает дополнительным преимуществом, заключающимся в том, что все еще можно использовать весь материал MVC-ish, который можно было бы ожидать в типичном представлении, например, возможность JSON кодировать переданную в модели и генерировать URL-адреса с использованием Url. Действие. Этот подход является элегантным способом настройки контроллеров AngularJS - каждый частичный вид может представлять собой отдельный контроллер в модуле Angular. Так чисто! – Dan 16 December 2016 в 03:43

Первым решением, о котором я могу думать, является использование ViewBag для хранения значений, которые должны отображаться.

На самом деле я никогда не пробовал, если это работает с частичным представлением, но оно должно быть imo.

2
ответ дан Iridio 18 August 2018 в 05:24
поделиться
  • 1
    Просто попробовал; к сожалению, это не сработало (создало ViewBag.RenderScripts = new List<string>(); в верхней части главной страницы, а затем вызвало @Html.Partial("_CreateUpdatePartial",Model,ViewData), затем положил @section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}. В частичном представлении я положил @{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}. – JohnLBevan 29 August 2014 в 12:55

У меня была аналогичная проблема, когда у меня была главная страница:

@section Scripts {
<script>
    $(document).ready(function () {
        ...
    });
</script>
}

...

@Html.Partial("_Charts", Model)

, но частичный вид зависел от некоторого JavaScript в разделе «Сценарии». Я решил это, закодировав частичное представление как JSON, загрузив его в переменную JavaScript, а затем используя это, чтобы заполнить div, так:

@{
    var partial = Html.Raw(Json.Encode(new { html = Html.Partial("_Charts", Model).ToString() }));
}

@section Scripts {
<script>
    $(document).ready(function () {
        ...
        var partial = @partial;
        $('#partial').html(partial.html);
    });
</script>
}

<div id="partial"></div>
0
ответ дан John M 18 August 2018 в 05:24
поделиться
  • 1
    IMO, вы должны решить это, переместив JS в отдельный файл. – Worthy7 2 August 2016 в 00:59

Вам не нужно использовать части с частичным представлением.

Включить в свой частичный просмотр. Он выполняет функцию после загрузки jQuery. Вы можете изменить условие условия для вашего кода.

<script type="text/javascript">    
var time = setInterval(function () {
    if (window.jQuery != undefined) {
        window.clearInterval(time);

        //Begin
        $(document).ready(function () {
           //....
        });
        //End
    };
}, 10); </script>

Julio Spader

0
ответ дан Julio Spader 18 August 2018 в 05:24
поделиться

Вы можете использовать эти методы расширения: (Сохранить как PartialWithScript.cs)

namespace System.Web.Mvc.Html
{
    public static class PartialWithScript
    {
        public static void RenderPartialWithScript(this HtmlHelper htmlHelper, string partialViewName)
        {
            if (htmlHelper.ViewBag.ScriptPartials == null)
            {
                htmlHelper.ViewBag.ScriptPartials = new List<string>();
            }

            if (!htmlHelper.ViewBag.ScriptPartials.Contains(partialViewName))
            {
                htmlHelper.ViewBag.ScriptPartials.Add(partialViewName);
            }

            htmlHelper.ViewBag.ScriptPartialHtml = true;
            htmlHelper.RenderPartial(partialViewName);
        }

        public static void RenderPartialScripts(this HtmlHelper htmlHelper)
        {
            if (htmlHelper.ViewBag.ScriptPartials != null)
            {
                htmlHelper.ViewBag.ScriptPartialHtml = false;
                foreach (string partial in htmlHelper.ViewBag.ScriptPartials)
                {
                    htmlHelper.RenderPartial(partial);
                }
            }
        }
    }
}

Использовать так:

Пример частичного: (_MyPartial.cshtml) Поместите html в if и js в else.

@if (ViewBag.ScriptPartialHtml ?? true)
    <p>I has htmls</p>
}
else {
    <script type="text/javascript">
        alert('I has javascripts');
    </script>
}

В вашем _Layout.cshtml или везде, где вы хотите, чтобы скрипты из частичных объектов были визуализированы, поставьте следующий (один раз): он будет отображать только javascript всех партиций на текущей странице в этом месте.

@{ Html.RenderPartialScripts(); }

Затем, чтобы использовать ваши частичные, просто сделайте это: он отобразит только html в этом месте.

@{Html.RenderPartialWithScript("~/Views/MyController/_MyPartial.cshtml");}
1
ответ дан Lomak 18 August 2018 в 05:24
поделиться

Я только что добавил этот код на мой частичный вид и решил проблему, хотя и не очень чистую, она работает. Вы должны убедиться, что идентификаторы объектов, которые вы просматриваете.

$ (document) .ready (function () {$ ("# Profile_ProfileID"). Selectmenu ({icons: {button: 'ui-icon -circle-arrow-s '}}); $ ("# TitleID_FK"). selectmenu ({icons: {button:' ui-icon-circle-arrow-s '}}); $ ("# CityID_FK"). selectmenu ({icons: {button: 'ui-icon-circle-arrow-s'}}); $ ("# GenderID_FK"). selectmenu ({icons: {button: 'ui-icon-circle-arrow-s' }}); $ ("# PackageID_FK"). Selectmenu ({icons: {button: 'ui-icon-circle-arrow-s'}});});
0
ответ дан luis 18 August 2018 в 05:24
поделиться

Существует фундаментальный недостаток в том, как мы думаем о сети, особенно при использовании MVC. Недостатком является то, что JavaScript как-то ответственен за представление. Представление - это представление, JavaScript (поведенческий или другой) - это JavaScript. В шаблоне MVVM от Silverlight и WPF мы сталкиваемся с «представлением первой» или «первой моделью». В MVC мы всегда должны пытаться рассуждать с точки зрения модели, и JavaScript во многом является частью этой модели.

Я бы предложил использовать шаблон AMD (мне самому нравится RequireJS ). Отделите свой JavaScript в модулях, определите свою функциональность и подключите свой html к JavaScript, вместо того чтобы полагаться на представление для загрузки JavaScript. Это очистит ваш код, разделит ваши проблемы и облегчит жизнь всем одним махом.

4
ответ дан Mr. Baudin 18 August 2018 в 05:24
поделиться
  • 1
    В течение двух или трех месяцев или около того я использую RequireJS, и я не думаю, что когда-либо создаю другое веб-приложение без RequireJS. – tugberk 18 June 2013 в 11:00
  • 2
    JavaScript также может быть ответственностью View. – Kelmen 13 July 2013 в 05:39
  • 3
    Использование шаблона AMD - хорошая идея, но я не согласен с вашим утверждением, что JavaScript является частью модели. Часто приходится определять поведение представления, особенно в сочетании с чем-то вроде Knockout. Вы даете JSON-представление своей модели в свой вид JavaScript. Лично я просто использую закрытие, обычное пространство имен и т. Д. на объекте window и включить библиотечные скрипты перед любыми частичными. – crush 13 February 2015 в 02:22

Идея Плутона в лучшую сторону:

CustomWebViewPage.cs:

    public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel> {

    public IHtmlString PartialWithScripts(string partialViewName, object model) {
        return Html.Partial(partialViewName: partialViewName, model: model, viewData: new ViewDataDictionary { ["view"] = this, ["html"] = Html });
    }

    public void RenderScriptsInBasePage(HelperResult scripts) {
        var parentView = ViewBag.view as WebPageBase;
        var parentHtml = ViewBag.html as HtmlHelper;
        parentView.DefineSection("scripts", () => {
            parentHtml.ViewContext.Writer.Write(scripts.ToHtmlString());
        });
    }
}

Views \ web.config:

<pages pageBaseType="Web.Helpers.CustomWebViewPage">

Вид:

@PartialWithScripts("_BackendSearchForm")

Partial (_BackendSearchForm.cshtml):

@{ RenderScriptsInBasePage(scripts()); }

@helper scripts() {
<script>
    //code will be rendered in a "scripts" section of the Layout page
</script>
}

Страница макета:

@RenderSection("scripts", required: false)
0
ответ дан PaulSanS 18 August 2018 в 05:24
поделиться

Есть способ вставить разделы в частичные виды, хотя это не очень. Вам нужно иметь доступ к двум переменным из родительского представления. Поскольку часть вашего частичного представления имеет целью создать этот раздел, имеет смысл требовать эти переменные.

Вот как выглядит вставка раздела в частичном представлении:

@model KeyValuePair<WebPageBase, HtmlHelper>
@{
    Model.Key.DefineSection("SectionNameGoesHere", () =>
    {
        Model.Value.ViewContext.Writer.Write("Test");
    });
}

И на странице, вставляющей частичный вид ...

@Html.Partial(new KeyValuePair<WebPageBase, HtmlHelper>(this, Html))

Вы также можете использовать эту технику для определения содержимого раздела программно в любом классе.

Наслаждайтесь !

1
ответ дан Pluto 18 August 2018 в 05:24
поделиться
  • 1
    Можете ли вы и ссылку на полностью рабочий проект? – Ehsan Zargar Ershadi 11 January 2018 в 10:08

У меня была аналогичная проблема, которая была решена с помощью этого:

@section ***{
@RenderSection("****", required: false)
}

Thats прекрасный способ для инъекций, я думаю.

-5
ответ дан Pouria Jafari 18 August 2018 в 05:24
поделиться

Это помогло мне разрешить совместное размещение javascript и html для частичного просмотра в том же файле. Помогает с мыслительным процессом увидеть html и связанную с ним часть в том же файле с частичным представлением.


В представлении, который использует Partial View, называемый «_MyPartialView.cshtml»

<div>
    @Html.Partial("_MyPartialView",< model for partial view>,
            new ViewDataDictionary { { "Region", "HTMLSection" } } })
</div>

@section scripts{

    @Html.Partial("_MyPartialView",<model for partial view>, 
                  new ViewDataDictionary { { "Region", "ScriptSection" } })

 }

В файле Partial View

@model SomeType

@{
    var region = ViewData["Region"] as string;
}

@if (region == "HTMLSection")
{


}

@if (region == "ScriptSection")
{
        <script type="text/javascript">
    </script">
}
1
ответ дан purvin 18 August 2018 в 05:24
поделиться

Я решил этот совершенно другой маршрут (потому что я торопился и не хотел реализовывать новый HtmlHelper):

Я завернул свой Partial View в большом if-else:

@if ((bool)ViewData["ShouldRenderScripts"] == true){
// Scripts
}else{
// Html
}

Затем я дважды вызывал Partial с пользовательской ViewData:

@Html.Partial("MyPartialView", Model, 
    new ViewDataDictionary { { "ShouldRenderScripts", false } })

@section scripts{
    @Html.Partial("MyPartialView", Model, 
        new ViewDataDictionary { { "ShouldRenderScripts", true } })
}
-1
ответ дан Rick Love 18 August 2018 в 05:24
поделиться
  • 1
    Разумеется, вся идея заключается в том, что потребителю частичного представления не нужно знать, что он должен включать сценарии, это своего рода проблема? В противном случае вы можете как-то просто сказать @Html.Partial("MyPartialViewScripts") – dan richardson 24 February 2015 в 12:38
  • 2
    Нет, идея состоит в том, чтобы позволить скриптам быть определенными в том же документе, что и html, но я согласен, что это не идеально. – Rick Love 24 February 2015 в 22:20

, вы можете использовать свою папку / index.cshtml в качестве главной страницы, затем добавить скрипты раздела. Затем в вашем макете есть:

@RenderSection("scripts", required: false) 

и ваш index.cshtml:

@section scripts{
     @Scripts.Render("~/Scripts/file.js")
}

, и он будет работать над всеми вашими частичными просмотрами. Это работает для меня

0
ответ дан RogerEdward 18 August 2018 в 05:24
поделиться

Если у вас есть законная необходимость запускать некоторые js из partial, вот как вы могли это сделать, требуется jQuery:

<script type="text/javascript">        
    function scriptToExecute()
    {
        //The script you want to execute when page is ready.           
    }

    function runWhenReady()
    {
        if (window.$)
            scriptToExecute();                                   
        else
            setTimeout(runWhenReady, 100);
    }
    runWhenReady();
</script>
7
ответ дан Serj Sagan 18 August 2018 в 05:24
поделиться
  • 1
    вы знаете, setTimeout(SeeIfReady, 100) тоже работает, нет необходимости в неявной оценке ... – drzaus 13 February 2014 в 20:32
  • 2
    Я попробовал @drzaus, ему нужен «SeeIfReady», или он не работает. – Cacho Santa 3 June 2014 в 23:16

У меня была эта проблема, и я использовал эту технику .

Это лучшее решение, которое я нашел очень гибким.

Также, пожалуйста, проголосуйте здесь , чтобы добавить поддержку декларации кумулятивного раздела

13
ответ дан Shimmy 18 August 2018 в 05:24
поделиться

предположим, что у вас есть частичный вид, называемый _contact.cshtml, ваш контакт может быть законным (имя) или физическим субъектом (имя, фамилия). ваш взгляд должен заботиться о том, что отображается, и что может быть достигнуто с помощью javascript. поэтому может потребоваться отложенный рендеринг и внутренний вид JS.

единственный способ, о котором я думаю, о том, как его можно опустить, - это когда мы создаем ненавязчивый способ обращения с такими проблемами пользовательского интерфейса.

также обратите внимание, что MVC 6 будет иметь так называемый компонент View, даже фьючерсы MVC имели некоторые подобные вещи, и Telerik также поддерживает такую ​​вещь ...

-3
ответ дан user4298890 18 August 2018 в 05:24
поделиться
  • 1
    3 года поздно, и я не думаю, что это даже ответы на вопрос вообще? Что вы пытаетесь сказать здесь? Отвечая на вопрос 3 года спустя со спекулятивными особенностями технологий future , на самом деле не является ответом или особенно полезным – dan richardson 8 December 2014 в 12:30
Другие вопросы по тегам:

Похожие вопросы: