2012-11-25 30 views
2

我是一個全新的用戶在這裏 - 但我一直在尋找現在幾個小時來解決以下問題:的DropDownList綁定到的ActionResult Create方法MVC 4 VS2012

我有2個實體 - 類別和項目。 每個項目應該屬於一個類別 - 因此,我希望有一個DropDownList,它可以在創建新項目時顯示所有現有類別。 到目前爲止,我的代碼顯示了DropDownList與所有類別,但是當我選擇一個類別並提交表單(POST)時,類別的值始終爲空。 這自然會導致ModelState.IsValid爲false,因爲Category不可爲空。 如何將用戶選定的值導入到我的創建(POST)方法中?

I've got a Controller with following Methods to Create a new Item: 

// GET Method 
public ActionResult Create() 
{ 
    ViewBag.Category = new SelectList(db.CategorySet, "Id", "CategoryName"); 
    return View(); 
} 
[HttpPost] 
public ActionResult Create(Item item) 
{ 
    if (ModelState.IsValid) 
    { 
     db.ItemSet.Add(item); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

return View(item); 
} 

And this is the DropDownList in my View (Create.cshtml): 
<div class="editor-field"> 
@Html.DropDownList("Category", (IEnumerable<SelectListItem>) ViewBag.Categories, "--Select Category--") 
</div> 

回答

1

Fina最後,我結束了自定義視圖模型 - 這樣我得到它的工作...

對於那些不知道自定義視圖模型是什麼的人: 您創建一個新的類,其中包含所有的值你需要創建你的新對象,在我的例子中是一個包含可選類的SelectList(屬性),SelectedCategoryId的整數值(屬性)和你想創建的Item(屬性)的類。 在您的cshtml文件中,您將此類添加爲@model .... CustomCreateItemModel並將其用於您的DropDownList中

0

如果你的項目有一個類別ID屬性:

public class Item 
{ 
    public int CategoryId {get;set;] 
} 

您需要命名DropDownList"CategoryId",以便ModelBinder就能綁定值正確

或者使用強類型幫手:

Html.DropDownListFor(x=>x.CategoryId...) 
+0

是我在兩個實體中都有一個int ID作爲主鍵,但我仍然無法弄清楚如何讓這個東西運行......我試圖改變DropDownList,但它不是甚至顯示我的項目了 –

0

謝謝Armen。

我有同樣的問題,我的下拉列表被填充從數據庫中確定,但OrganisationID(在我的情況下)沒有把它創建一個新的記錄時數據庫(在我的情況下只有0總是被捕獲) - 直到我只是將ViewBag的名稱更改爲與下拉列表中的值相同(即兩個OrganisationID) - 正如您曾經指出的那樣 - 現在它可以工作!

對於那些經歷過「絕望編碼器」的挫敗感,我經歷了我們的命名不一致以啓用綁定的情況,這裏是我用來獲得下拉列表的工作原因(對不起 - 不使用實體框架,但如果您使用EF,原則應該仍然清晰易用):

但是關鍵的問題是使用相同的命名來啓用綁定。再次感謝阿門!

模型

public class Organisation_Names 
    { 
     public DataSet GetOrg_Names() 
     { 
      SqlConnection cn = new SqlConnection(@"Data Source=XXXXXXXXX;User ID=XXXXXXXXX;Password=XXXXXXXXXXX;Initial Catalog=XXXXXXXXXXXX"); 
      SqlCommand cmd = new SqlCommand("sp_GetOrg_Names", cn); 
      cn.Open(); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.ExecuteNonQuery(); 
      DataSet ds = new DataSet(); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(ds); 
      return ds; 
     } 
    } 

控制器

// 
    // GET: /Services/Create 
    **public ActionResult Create(Organisation_Names organisation_names) 
    { 
     DataSet ds = organisation_names.GetOrg_Names(); 
     ViewBag.OrganisationID = ds.Tables[0]; 
     List<SelectListItem> items = new List<SelectListItem>(); 
     foreach (System.Data.DataRow dr in ViewBag.OrganisationID.Rows) 
     { 
      items.Add(new SelectListItem { Text = @dr["OrganisationName"].ToString(), Value = @dr["OrganisationID"].ToString() }); 
     } 
     ViewBag.OrganisationID = items; 
     return View(); 
} 


// 
    // POST: /Services/Create 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    **public ActionResult Create(CreateServiceModel createservicemodel, Organisation_Names organisation_names, FormCollection selection) 
    { 
DataSet ds = organisation_names.GetOrg_Names(); 
     if (ds == null) 
     { 
      return HttpNotFound(); 
     } 
     ViewBag.OrganisationID = ds.Tables[0]; 
     List<SelectListItem> items = new List<SelectListItem>(); 
     foreach (System.Data.DataRow dr in ViewBag.OrganisationID.Rows) 
     { 
      items.Add(new SelectListItem { Text = @dr["OrganisationName"].ToString(), Value = @dr["OrganisationID"] + 1.ToString() }); 
     } 
     ViewBag.OrganisationID = items;** 

if (this.IsCaptchaVerify("Answer was incorrect. Please try again.")) 
     { 
      try 
      { 
int _records = createservicemodel.CreateService(createservicemodel.OrganisationID, createservicemodel.ServiceName, createservicemodel.ServiceDescription, createservicemodel.ServiceComments, createservicemodel.ServiceIdentificationNumber, createservicemodel.CreatedBy, createservicemodel.NewServiceID); 

       if (_records > 0) 
       { 
        return RedirectToAction("Index", "Services"); 
       } 
      } 
      catch 
      //else 
      { 
       ModelState.AddModelError("", "Cannot Create"); 
      } 

     } 
     { 
      return View(createservicemodel); 
     } 


    } 

VIEW

@model WS_TKC_MVC4.Models.CreateServiceModel 
@using CaptchaMvc.HtmlHelpers 
@using WS_TKC_MVC4.Models 
@{ViewBag.Title = "Service added by " ;} @User.Identity.Name 


<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript">  </script> 

@using (Html.BeginForm()) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>CreateServiceModel</legend> 

<div class="editor-label"> 
    <p>Select Organisation</p> 
</div> 
    <div class="editor-field"> 
    @Html.DropDownList("OrganisationID") 
@Html.ValidationMessageFor(model => model.OrganisationID) 
     @Html.EditorFor(model => model.OrganisationID) 
    </div> 

(有些多個字段)

<div class="editor-label"> 
     @Html.LabelFor(model => model.MathCaptcha) 
    </div> 
    @Html.MathCaptcha("Refresh", "Type answer below", "Answer is a required field.") 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div>