Frage

Ich erstelle derzeit das Administrator-Back-End für eine Website in ASP.NET MVC.

In einer ASP.NET -MVC -Anwendung habe ich mit der Helfer -Methode von "Editor" wie SO angefangen:

<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>

Im Modell wurde das Feld "Biographie" mit: [Uihelper ("html")] dekoriert.

Ich habe eine teilweise Ansicht 'HTML' (unter Ansichten/Shared/EditorTemplates):

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

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

Jetzt möchte ich das Attribut "ID" des "textarea" auf den Namen des Feldes wie folgt einstellen:

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

Aber ich kann keinen Weg sehen, um das mit dem aktuellen Setup zu tun.

Alles, was ich mir vorstellen kann, ist ein "HTML" -Ansichtsmodel zu erstellen, das eine "Wert" -Sache und eine "ControlId" -Sache enthält.

Aber wenn ich die Ansicht dadurch anstelle von 'system.xml.linq.xelement' stützt, wäre dies nicht mehr mit der Helfer -Methode "Editor" kompatibel und ich müsste alles manuell tun.

Hat jemand schon ein ähnliches Problem gehabt?

War es hilfreich?

Lösung

Sie sollten in der Lage sein, die gewünschte ID aus der Eigenschaft viewData.templateInfo.htmlfieldPrefix der Ansicht herauszuholen. So was:

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

Um zu zeigen, warum dies funktioniert, ist hier der Ort in templateHelpers.cs (von MVC2 Preview 1 Quelle), an der ViewData für die Editor -Vorlagesteuerung initialisiert wird:

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),
    }
};

Im obigen Anruf wird "Ausdruck" initialisiert (weiter oben im Anrufstapel), wobei der Name der Eigenschaft bearbeitet wird.

Übrigens, @Sperling unten erwischte ein Detail, das ich ursprünglich verpasst habe: Wenn Sie einen Nicht-Default verwenden (oder verwenden) HtmlHelper.IdAttributeDotReplacement, Dann möchten Sie die Punkte in der ersetzen HtmlPrefix Eigentum mit HtmlHelper.IdAttributeDotReplacement.

Andere Tipps

Verwenden Sie dies, um ID zu generieren (mit Modellpräfix). Überspringen Sie den Teil .Replace (), wenn Sie das Namensattribut möchten.

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

In unserem Fall mussten wir verwenden Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName mit ExpressionHelper.GetExpressionText

was in Rasiermesser so verwendet wurde:

           // 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"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top