2009-07-20 2 views
1

Ich benutze die Modellbinder-Funktionalität von asp.net, um Formularwerte an meine Entität zu binden, wenn Sie aus einer Ansicht veröffentlichen.Dropdown-Wert null bei Verwendung von Viewmodel & Modelbinder in asp.net mvc

Das HTML rendert korrekt in der anfänglichen Ansicht mit korrekten Options- und Wertelementen.

Beim Ausfüllen des Formulars und der Buchung werden alle Werte korrekt in die Entität eingetragen, mit Ausnahme des Werts aus der Dropdown-Liste. nicht sicher, was ich falsch mache.

Code unten angehängt:

Kunden Entity:

public class Customer : EntityBase 
    { 
     public virtual string Name { get; set; } 
     public virtual string Email { get; set; } 
     public virtual string Mobile { get; set; } 
     public virtual Store LocalStore { get; set; } 
     public virtual DateTime? DateOfBirth { get; set; } 

     public Customer(){} 

     public Customer(string name, string email, string mobile, Store localStore):this(name, email, mobile, localStore, null) 
     { 
     } 

     public Customer(string name, string email, string mobile, Store localStore, DateTime? dateOfBirth) 
     { 
      Name = name; 
      Email = email; 
      Mobile = mobile; 
      LocalStore = localStore; 
      DateOfBirth = dateOfBirth; 
     } 
    } 

Ansichtsmodell:

public class CustomerViewModel { 

     // Properties 
     private IStoreRepository _StoreRepository; 
     public Customer Customer { get; private set; } 
     public SelectList Stores { get; private set; } 

     // Constructor 
     public CustomerViewModel(IStoreRepository storeRepository, Customer customer) 
     { 
      _StoreRepository = storeRepository; 
      Customer = customer; 
       Stores = new SelectList(_StoreRepository.GetAllStores(), "Id", "Name", Customer.LocalStore.Id); 

     } 
    } 

Controller:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Create([Bind(Prefix="")]Customer customer) 
     { 
      return View(new CustomerViewModel(_StoreRepository, customer)); 
     } 

Ausblick:

<%@ Import Namespace="BlackDiamond.Buzz.MVCWeb.Controllers"%> 
<%@ Import Namespace="BlackDiamond.Buzz.Core"%> 
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CustomerViewModel>" %> 
<% 
    Customer customer = ViewData.Model.Customer; 
    using (Html.BeginForm()) 
    { 
    %>  
    <table> 
     <tr> 
      <td>Local Store:</td> 
      <td><%= Html.DropDownList("LocalStore", ViewData.Model.Stores)%></td> 
     </tr> 
     <tr> 
      <td>Name:</td><td><%= Html.TextBox("Name", customer.Name)%></td> 
     </tr> 
     <tr> 
      <td>Email:</td><td><%= Html.TextBox("Email", customer.Email)%></td> 
     </tr> 
     <tr> 
      <td>Mobile:</td><td><%= Html.TextBox("Mobile", customer.Mobile)%></td> 
     </tr> 
    </table> 
    <input type="submit" value="Create" /> 
<%}%> 

Antwort

1

Haben einen benutzerdefinierten Modelbinder zu schaffen Store Einheit auf dem GUID aus der Dropdown-Liste basierte abzurufen:

public class CustomerModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType == typeof(Customer)) 
     { 
      // get values 
      string name = bindingContext.ValueProvider["Name"].AttemptedValue; 
      string email = bindingContext.ValueProvider["Email"].AttemptedValue; 
      string mobile = bindingContext.ValueProvider["Mobile"].AttemptedValue; 
      Guid storeId = new Guid(bindingContext.ValueProvider["LocalStore"].AttemptedValue); 
      Store localStore = IoC.Container.Resolve<IStoreRepository>().GetStore(storeId); 

      // hydrate 
      return new Customer(name, email, mobile, localStore); 
     } 
     else 
     { 
      return null; 
     } 
    } 
} 
1

Vielleicht, weil Sie LocalStore als Store-Typ deklarieren?

public virtual Store LocalStore { get; set; } 

Ich denke, es sollte int sein (wenn "id" -Eigenschaft ist int) oder Zeichenfolge. Nicht sicher, obwohl.

public virtual int LocalStore { get; set; } 
+0

Danke für den Beitrag. Das Problem war in der Tat der LocalStore-Wert, der ein Objekt vom Typ Store im Gegensatz zu einer String-Guid ist. Musste einen benutzerdefinierten Modelbinder erstellen, um den richtigen Store mithilfe der GUID-ID zu erhalten. Nochmals vielen Dank für die Post –