2016-12-25 4 views
0

Guten Tag! Ich bin sehr neu in ASP.NET und habe versucht, mehrere Tutorials zu recherchieren und würde das Feedback dieser Community sehr schätzen.ASP.NET MVC 5 - Dropdownliste von einem anderen Modell

Ich versuche eine kaskadierende Dropdown-Liste von einem anderen Modell zu erstellen. Im Verlauf habe ich eine CombinedModel

Modell-Ansicht

//Combined model 
namespace WebApplication2.Models 
{ 
public class CombinedModel 
{ 
    public RegisterViewModel RegisterViewModel { get; set; } 
    public DistrictModel Districtmodel { get; set; } 
} 
} 


    //Model 1 
    public class RegisterViewModel 
    { 
    [Required] 
    [EmailAddress] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    public string ConfirmPassword { get; set; } 

    public virtual List<DistrictModel> DistrictName { get; set; } 

//Model 2 
namespace WebApplication2.Models 
{ 
public class DistrictModel 
{ 
    public int DistrictID { get; set; } 
    public string DistrictName { get; set; } 
} 
} 

-Controller-View

public ActionResult Register() 
    { 
     ViewBag.DistrictNameList = new SelectList(db.DistrictModel,    "DistrictName", "DistrictName"); 
     return View(); 
    } 

Ansicht

 model WebApplication2.Models.CombinedModel 
    using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
     <div class="col-md-10"> 

    Html.DropDownListFor(m => m.RegisterViewModel.DistrictName, ViewBag.DistrictNameList, new { @class = "form-control" }) 
    </div> 

Und es scheint nicht zu funktionieren ... Ich habe versucht, es zu Enum zu ändern und es würde immer noch nicht entsprechen. Ich würde mich über Ihr Feedback freuen!

Antwort

0

Ändern Sie diese Zeile

public virtual List<DistrictModel> DistrictName { get; set; } 

Zu diesem

public virtual string DistrictName { get; set; } 

ODER

Ändern Sie den Code wie unten

Modell

public class RegisterViewModel 
    { 
     [Required] 
     [EmailAddress] 
     [Display(Name = "Email")] 
     public string Email { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 

     [DataType(DataType.Password)] 
     [Display(Name = "Confirm password")] 
     public string ConfirmPassword { get; set; } 

     public virtual string DistrictName { get; set; } 

     public virtual SelectList DistrictList { get; set; } 

    } 
    public class DistrictModel 
    { 
     public int DistrictID { get; set; } 
     public string DistrictName { get; set; } 
    } 

    public class CombinedModel 
    { 
     public RegisterViewModel RegisterViewModel { get; set; } 
     public DistrictModel Districtmodel { get; set; } 
    } 

-Controller

 CombinedModel obj = new CombinedModel(); 
     obj.RegisterViewModel = new RegisterViewModel();; 
     obj.RegisterViewModel.DistrictList = new SelectList(db.DistrictModel, "DistrictName", "DistrictName");; 
     return View(obj); 

Ansicht

@using (Html.BeginForm("Index", "home", FormMethod.Post, 
             new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.DropDownListFor(model => model.RegisterViewModel.DistrictName, Model.RegisterViewModel.DistrictList, new { @class = "form-control" }) 
    <input type="submit" /> 
} 
+0

danke in der Tat, das hat funktioniert! – moka

0

Ihre Frage hat keinen Code über irgendwelche kaskadierenden Dropdowns! Aber ich sehe ein Problem mit Ihrem Code, um das Dropdown zu rendern.

Sie müssen die viewBag Elemente zu einem SelectList Beause die DropDownListFor Überlastung erwartet, dass kein dynamisches Objekt!

@using (Html.BeginForm("Index", "home", FormMethod.Post, 
             new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.DropDownListFor(m => m.RegisterViewModel.DistrictName, 
       ViewBag.DistrictNameList as SelectList, new { @class = "form-control" }) 
    <input type="submit" /> 
} 
+0

Hallo shyju dank der Tat für die Korrektur auf Kaskadierung, die Lösung nicht funktioniert hat „wie Select“, seine Fehler zeigt, wenn ich es hinzufügen. – moka

+0

Was ist der Fehler? Der Code sollte so lange funktionieren, wie Ihre Aktionsmethode die ViewBag.DistrictNameList so einstellt, wie Sie in der Frage gezeigt haben. – Shyju

0

Dank für die Antworten, dachte ich die endgültige Abhilfe zu schreiben und es mit allen teilen. Das Problem war, dass ich die Modelle nicht richtig eingerichtet habe. Ich musste auch Ansichtsbeutel in Get/Post hinzufügen und in Dropdown-Liste für in Sicht geändert werden.

Modell

public class AssetRequest 
    { 
     public int Id { get; set; } 

     [DataType(DataType.Date)] 
     [Display(Name = "Request date")] 
     public DateTime AssetRequestDate { get; set; } 



     [Display(Name = "Facility")] 
     public int FacilityId { get; set; } 
     public virtual Facility Facility { get; set; } 

public class Facility 
    { 
     public int Id { get; set; } 


     [Display(Name="Asset")] 
     public string AssetName { get; set; } 

     public virtual ICollection<AssetRequest> AssetRequests { get; set; } 
    } 

public DbSet<AssetRequest> AssetRequestTable { get; set; } 
     public DbSet<Asset> AssetTable { get; set; } 

     public DbSet<District> DistrictTable { get; set; } 

-Controller

// GET: AssetRequests/Create 
     public ActionResult Create() 
     { 

      ViewBag.RequestStatusId = "New request"; 
      ViewBag.AssetRequestDate = DateTime.Now; 
      ViewBag.AssetId = new SelectList(db.AssetTable, "Id", "AssetName"); 
      ViewBag.DistrictId = new SelectList(db.FacilitytTable, "Id", "DistrictName"); 
      ViewBag.RequestTypeId = new SelectList(db.RequestTypeTable, "Id", "RequestTypeName"); 
      return View(); 
     } 


[HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Create([Bind(Include = "Id,AssetRequestDate,FacilityId,AssetId,RequestTypeId, RequestStatusId")] AssetRequest assetRequest) 
     { 
      var currentUser = await manager.FindByIdAsync(User.Identity.GetUserId()); 

      if (ModelState.IsValid) 
      { 
       assetRequest.User = currentUser; 
       assetRequest.AssetRequestDate = DateTime.Now; 
       assetRequest.RequestStatusId = 1; 
       db.AssetRequestTable.Add(assetRequest); 
       await db.SaveChangesAsync(); 
       return RedirectToAction("Index"); 
      } 

Danke für alle Antworten!

0

Ok

das Bezirks Modell

public class DistrictModel 
{ 
    public int Id { get; set; } 
    public string DistrictName { get; set; } 
} 

die RegisterViewModel

public class RegisterViewModel 
{ 
    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    public string ConfirmPassword { get; set; } 

    //Mapping 
    public int DistrictId { get; set; } 
    public virtual List<DistrictModel> District { get; set; } 
} 

auf Controller-Ebene

public ActionResult Register() 
{ 
    List<DistrictModel> districtModelList = db.DistrictModel.ToList(); 
    ViewData["DistrictNameList"] = districtModelList.Select(x => new SelectListItem { Value = x.Id , Text = x.DistrictName }); 
    return View(); 
} 

Am Ansicht

model RegisterViewModel 
@using (Html.BeginForm("Index", "home", FormMethod.Post, 
            new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.DropDownListFor(model => model.DistrictId, (IEnumerable<SelectListItem>)ViewData["DistrictNameList"], "[Select District]", new { @class = "form-control" }) 
    <input type="submit" /> 
}