3 Stimmen

Wie bindet man eine Html.DropDownList ohne ViewData (Strongly-Typed View)

Ich kann nicht scheinen, um eine gute Blog-Post zu finden, die zeigt, wie ein Modell zu einer Ansicht ohne die magischen Zeichenfolgen "ViewData" zu binden (mit einer stark typisierten Ansicht ist der Ansatz, den ich versuche zu nehmen)

Weiß jemand, was ich in der unten ändern müssen, um diese direkt an mein Modell zu binden?

Siehe

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of IEnumerable (Of MvcApplication1.Category))" %>
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <%=Html.DropDownList("CategoryList")%>
</asp:Content>

Controller

Function Index() As ActionResult
    Dim list As New List(Of Category)
    list.Add(New Category With {.CategoryID = 1, .CategoryName = "Test1"})
    list.Add(New Category With {.CategoryID = 2, .CategoryName = "Test2"})

    Return View()
End Function

EDITAR

Die endgültige Lösung in VB ist unten abgebildet. Vielen Dank für die große Resonanz!

Controller

Function Index() As ActionResult
    Dim id As Integer = 1
    Dim ProductObject As Product = mProductService.GetProductById(id)

    Return View(ProductObject)
End Function

Siehe

<%=Html.DropDownList("Category", New SelectList(Model.Categories, "CategoryID", "CategoryName"))%>

Produktklasse (mit einer IEnumeralbe-Eigenschaft für die Kategorien)

Public Class Product
    Public Sub New()

    End Sub

    Private mProductID As Integer
    Public Property ProductID() As Integer
        Get
            Return mProductID
        End Get
        Set(ByVal value As Integer)
            mProductID = value
        End Set
    End Property

    ReadOnly Property Categories() As IEnumerable(Of Category)
        Get
            Dim list As New List(Of Category)
            list.Add(New Category With {.CategoryID = 1, .CategoryName = "Test1"})
            list.Add(New Category With {.CategoryID = 2, .CategoryName = "Test2"})

            Return list
        End Get
    End Property

End Class

5voto

tvanfosson Punkte 506878

Die Dropdown-Listenhilfe nimmt eine IEnumerable<SelectListItem> , nicht ein IEnumerable<Category> . In der Regel haben Sie Ihre Seite mit einem bestimmten Modell. Das Modell enthält eine Eigenschaft für den ausgewählten Wert aus der Dropdown-Liste, nicht für die Sammlung. Sie liefern die Sammlung, aus der Sie über ViewData auswählen. Sie könnten ein reines Ansichtsmodell haben, das sowohl die Eigenschaften als auch die Sammlung(en) enthält, aus der/denen ausgewählt werden soll, aber das könnte eine Vermehrung von Klassen bedeuten. Es gibt eine Debatte darüber, ob wuchernde Klassen oder magische Strings das schlechtere Design sind.

Mein Verständnis von Ihrem Code wäre etwa so:

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Foo)" %>
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <%=Html.DropDownList("Category", ViewData("CategoryList"))%>
</asp:Content>

Function Index() As ActionResult
    Dim list As New List(Of SelectListItem)
    list.Add(New SelectListItem  With {.Value = 1, .Text = "Test1"})
    list.Add(New SelectListItem With {.Value = 2, .Text = "Test2"})
    ViewData("CategoryList") = list
    Return View()
End Function

wobei Foo eine Klasse ist, die eine Eigenschaft Category vom Typ int enthält.

Wenn Sie eine stark typisierte Ansicht erstellen möchten, dann muss Foo eine Eigenschaft Kategorien des Typs SelectListItem haben, dann ändern:

<%=Html.DropDownList("Category", ViewData("CategoryList"))%>

a

<%=Html.DropDownList("Category", Foo.Categories )%>

und

    ViewData("CategoryList") = list
    Return View()

a

    Dim foo as New Foo
    foo.Categories = list
    Return View(foo)

1voto

Adam Carr Punkte 2946

Sie könnten eine eigene Überladung der Hilfsmethode für Html.DropDownList erstellen, die das Modell direkt der DropDownList-Hilfe zuordnet.

Allerdings sollten Sie sich wirklich fragen, wie viel domänenspezifische Logik Ihre Ansicht enthalten sollte. ViewData hilft, Ihr Modell und Ihre Domänenlogik von Ihrer Ansicht zu trennen.

Beispiel:

Ich weiß, dies ist nicht eine "Überlastung", weil fühlte, dass, da dies noch einen Namen benötigen, würden Sie eine andere Methode, die nur eine Zeichenfolge für den Namen des Dropdowns, aber automatisch bindet das Modell an das Steuerelement (vorausgesetzt, es ist ein IEnumerable) möchten. Dies ist ein Beispiel für die HtmlHelper-Erweiterungsmethode.

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

namespace MvcApplication3.Helpers
{
    public static class ViewHelpers
    {
        public static string ModelDropDownList(this HtmlHelper htmlHelper, string name)
        {
            var model = htmlHelper.ViewData.Model as IEnumerable<SelectListItem>;
            if(model == null)
                return string.Empty;

            return htmlHelper.DropDownList(name, model);
        }
    }
}

So würden Sie dies in Ihrer Sichtweise aufrufen

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<SelectListItem>>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%= Html.ModelDropDownList("Test") %>
</asp:Content>

0voto

I Clark Punkte 140

Wenn Sie die Strongly Typed-Methode verwenden möchten, gibt es ein SelectList-Objekt, dem Sie eine IEnumerable übergeben können. Sie müssen die Eigenschaften Textfeld und Wertfeld von T angeben, aber dieses SelectList-Objekt kann direkt der Html.DropDownList-Hilfe zugewiesen werden:

c#
IList<Category> categories = new IList<Category>()
    {
        new Category() { ID = 1, Name = "Category 1" },
        new Category { ID = 2, Name = "Category 2" }
    };

SelectList categoryDropDown = new SelectList(categories, "ID", "Name");

ViewData["categoryDropDown"] = categoryDropDown;

dann tun:

c#
<%=Html.DropDownList("CategoryID", ViewData("categoryDropDown"))%>

Auf diese Weise können Sie eine IList von Kategorien von überall her übergeben (Dienstschicht, controllerweite Methode).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X