2013-03-05 2 views
0

Я ищу много здесь и найти что-то вроде этого, чтобы сделать Выпадающий список
это моя модель:mvc4 DROPDOWNLIST вставка NULL

public class Profits 
    { 
     [Key] 
     public int Id { get; set; } 
     public double Value { get; set; } 
     public string Description{ get; set; } 
     [DataType(DataType.Date)] 
     public DateTime DateInput { get; set; } 
     public UserProfile User { get; set; } 
     public Categories CategoryName { get; set; }//foreign key 
      public int CategoryID { get; set; } 
    } 

public class Categories 
    { 
     [Key] 
     public int Id { get; set; } 
     [Required] 
     public string Name { get; set; } 
     public UserProfile User { get; set; } 


    } 

это мой контроллер: Это передать мои данные для DROPDOWNLIST ...

public ActionResult Create() 
{ 
    var dba = new WHFMDBContext(); 
    var query = dba.Categories.Select(c => new { c.Id, c.Name }); 
    ViewBag.Id = new SelectList(query.AsEnumerable(), "Id", "Name", 3); 
    return View(); 
} 

[HttpPost] 
     [InitializeSimpleMembership] 
     public ActionResult Create(Profits profits) 
     { 
      var user = db.UserProfiles.FirstOrDefault(x => x.UserId == WebSecurity.CurrentUserId); 
      var profit = new Profits 
      { 
       Value= profits.Value, 
       Description = profits.Description, 
       DateInput =profits.DateInput, 
       CategoryName =profits.CategoryName,// ??? 
       User = user, 

      }; 
      db.Profits.Add(profit); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

Мой Вид:

@model WebHFM.Models.Profits 



@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Profits</legend> 


    <div class="editor-field"> 
    @Html.LabelFor(model => model.CategoryName) 
     </div> 
    <div class="editor-field"> 
     @Html.DropDownList("Id", (SelectList) ViewBag.Id, "--Select One--") 
     @Html.ValidationMessageFor(model => model.CategoryName) 
    </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Value) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Value) 
      @Html.ValidationMessageFor(model => model.Value) 
     </div>... 

Вставить данные в базу данных, но CategoryName_Id is NULL Что мне не хватает? и CategoryName = profits.CategoryName это внешний ключ к категориям в прибыли public Categories CategoryName { get; set; }

+0

проблема: я вижу данные db.Categories в моем DropDownList, но когда я выбираю какой-то из вариантов этой DDL и добавить некоторую ценность для других компонентов (из EditorFor). Они вставили в DB без выбранной категории из ddl вместо категории i имеют NULL. Спасибо за терпение – Krasimir

+0

Имеет ли ваш класс прибыли CategoryName или CategoryID. В вашем примере это CategoryName, но то, что вы устанавливаете для своего dropdownlist, является Id? –

+0

Является ли Category CategoryName списком категорий или одной категорией? –

ответ

1

Измените класс прибыли, добавьте это:

Profits 
{ 
    int CategoryID {get;set;} 
} 

изменить свой cshtml. Изменение

@Html.DropDownList("Id", (SelectList) ViewBag.Id, "--Select One--") 

в

@Html.DropDownList("CategoryID", (SelectList) ViewBag.Id, "--Select One--") 

изменить ваш контроллер:

public ActionResult Create(Profits profits) 
     { 
      var user = db.UserProfiles.FirstOrDefault(x => x.UserId == WebSecurity.CurrentUserId); 
      var category = db.Categories.FirstOrDefault(o => o.CategoryId == profits.CategoryID); 
      var profit = new Profits 
      { 
       Value= profits.Value, 
       Description = profits.Description, 
       DateInput =profits.DateInput, 
       CategoryName = category, 
       User = user 
      }; 
      db.Profits.Add(profit); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

Что это будет сделать, это изменить свой DropDownList, чтобы вернуть отобранную CategoryID. Разметка будет выглядеть следующим образом:

<select name="CategoryID" /> 

На вашем постбэка, это будет связываться с вашим новым Profits.CategoryID. Затем вы используете это, чтобы сделать запрос datbase для получения объекта выбранной категории, который затем присваивается Profits.CategoryName.

+0

Хорошо, я вижу сейчас. Вы можете заменить свой @ Html.EditorFor() на @ Html.Textbox(), что я говорю здесь. Вы получите nullref на model.CategoryName, так как вы не проходите в модели. –

+0

В разделе Profits.CategoryName указано, что список категорий или одна категория? –

+0

Это работает для db правильно. Спасибо, я знаю, смотрю categoryId, но в index.cshtml i see categoryId «0» – Krasimir

0

Вашего Создать() Действие Return return View(); без прохождения модели в параметры метода вида.

+0

и что должно быть здесь, потому что это не вид (запрос), я думаю – Krasimir

0

Это то, что я бы предложил, не глядя на вашу модель. PopulateCategoriesDropDownList живет в том же контроллере, как ваш Создать действие

private void PopulateCategoriesDropDownList(object selectedCategories = null) 
    { 
     var categoriesQuery = from d in _dataSource.Categories 
         orderby d.Name 
         select d; 
     ViewBag.CategoryId= new SelectList(categoriesQuery, "CategoryId", "Name", selectedCategories); 
    } 

Тогда ваши действия, как это.

[HttpGet] 
    public ActionResult Create() 
    { 
     PopulateCategoriesDropDownList(); 
    return View(); 
    } 


    [HttpPost] 
    [InitializeSimpleMembership] 
    public ActionResult Create(Profits profits) 
    { 
     var user = db.UserProfiles.FirstOrDefault(x => x.UserId ==  WebSecurity.CurrentUserId); 
     var profit = new Profits 
     { 
      Value= profits.Value, 
      Description = profits.Description, 
      DateInput =profits.DateInput, 
      CategoryName =profits.CategoryName,// ??? 
      User = user, 

     }; 
     db.Profits.Add(profit); 
     db.SaveChanges(); 
     PopulateCategoriesDropDownList(profit.CategoryId); 
     return View(profit); 
    } 

В вашем Вид:

<div class="editor-label"> 
      @Html.LabelFor(model => model.CategoryId, "Pick Category") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("CategoryId", String.Empty) 
     @Html.ValidationMessageFor(model => model.CategoryId) 
    </div><br/>