Заставить EditorFor префиксировать элементы ввода в представлении с именем класса? - PullRequest
5 голосов
/ 05 января 2011

У меня есть редактор для:

<%: Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false })%>

Это приведет к привязке к представлению в порядке (как и ожидалось), но не будет привязано к привязке при публикации модели. Это связано с тем, что перед идентификатором формы не стоит префикс «Клиент».

Обычно в этой ситуации я просто передаю модель, а затем связываю входные данные с моделью.Client.PropertyName в шаблоне, но это не вариант в этом случае, поскольку шаблон используется на двух разных моделях представления (на которых включен клиент) .

Какие-либо предложения по правильной привязке?

Большое спасибо, Кохан.


Добавление

Кажется, это было недоразумение с моей стороны, проблема, как я теперь понимаю, заключается в том, что fluentHtml не работает внутри EditorFor Templates. (То же самое относится и к этому исправлению, которое, как оказалось, не было необходимо, так как EditorFor будет автоматически добавлять мне префикс, если я заменю fluentHtml обычными помощниками mvc html)

Ответы [ 2 ]

10 голосов
/ 05 января 2011

Попробуйте что-то вроде:

<% Html.BeginHtmlFieldPrefixScope("Client") {
  Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false });
<% } %>

Перед каждым полем, которое вы создаете с помощью EditorFor, LabelFor и т.п., будет стоять префикс.

EDIT: Вот метод расширения, который я использую, извините!

public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
  return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}

... и класс ...

private class HtmlFieldPrefixScope : IDisposable
{
    private readonly TemplateInfo templateInfo;
    private readonly string previousHtmlFieldPrefix;

    public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
    {
        this.templateInfo = templateInfo;

        previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
        templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
    }

    public void Dispose()
    {
        templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
    }
}

См. Ссылку, упомянутую Коханом в комментариях ниже.

5 голосов
/ 31 июля 2011

MVC3: столкновение с именем HTML

Вырезание и вставка, которые не работают в MVC3.Чтобы заставить работать расширение, мне нужно было создать файл класса:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace incMvcSite.Classes {
    public static class HtmlPrefixScopeExtensions {
        public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix) {
            return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
        }

        private class HtmlFieldPrefixScope : IDisposable {
            private readonly TemplateInfo templateInfo;
            private readonly string previousHtmlFieldPrefix;

            public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix) {
                this.templateInfo = templateInfo;

                previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
                templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
            }

            public void Dispose() {
                templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
            }
        }
    }
}

В файле Razor (.cshtml) я добавил следующее:

@using incMvcSite.Classes
@using(Html.BeginHtmlFieldPrefixScope("Permission")) {
    <fieldset>
        <legend>Permission</legend>

        // The Html.EditorFor's would go here...
    </fieldset>
}

Обратите внимание на использованиепринести мне расширение класса в область видимости.Это позволяет работать с использованием второй строки.

Теперь проблема в том, что при повторной публикации объект не обновляется.В моем контроллере я использовал второй параметр для указания своего префикса:

TryUpdateModel(modelUser.Permission, "Permission");

Это добавило префикс ко всему полю в HTML, и TryUpdateModel загрузил объект с префиксными именами элементов управления.Теперь вы можете правильно использовать пространство имен для элементов управления для встроенных списков редактирования и для частичных представлений моделей с одинаковыми именами свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...