【问题标题】:DropDownList Binding to ActionResult Create Method MVC 4 VS2012DropDownList 绑定到 ActionResult 创建方法 MVC 4 VS2012
【发布时间】:2012-11-25 01:13:33
【问题描述】:

我是这里的全新用户 - 但我一直在寻找几个小时来解决以下问题:

我有 2 个实体 - 类别和项目。 每个项目都应该属于一个类别 - 因此我希望有一个 DropDownList 在创建新项目时显示所有现有类别。 到目前为止,我的代码显示了包含所有类别的 DropDownList,但是当我选择一个类别并提交表单 (POST) 时,类别的值始终为空。 这自然会导致 ModelState.IsValid 为 false,因为 Category 不可为空。 如何将 User-Selected-Value 放入我的 Create(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>

【问题讨论】:

    标签: c# razor asp.net-mvc-4 visual-studio-2012 html-select


    【解决方案1】:

    最后我得到了一个自定义视图模型——这样我就让它工作了......

    对于那些不知道什么是自定义视图模型的人: 您创建一个新类,其中包含创建新对象所需的所有值,在我的示例中,该类包含可用类别的 SelectList(属性)、SelectedCategoryId 的整数值(属性)和您想要的项目(属性)创造。 在您的 cshtml 文件中,您将此类添加为 @model ....CustomCreateItemModel 并在您的 DropDownList 中使用它

    【讨论】:

      【解决方案2】:

      如果您的 Item 具有 CategoryId 属性:

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

      您需要将DropDownList 命名为"CategoryId",以便ModelBinder 能够正确绑定值

      或者使用强类型帮助器:

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

      【讨论】:

      • 是的,我确实在两个实体中都有一个 int Id 作为主键,但我仍然无法弄清楚如何让这个东西运行......我试图改变 DropDownList,但后来它甚至不再显示我的项目了
      【解决方案3】:

      谢谢阿门。

      我有同样的问题,我的下拉列表可以从数据库中填充,但是在创建新记录时,OrganisationID(在我的情况下)没有进入数据库(在我的情况下,总是捕获到 0) - 直到我刚刚将 ViewBag 的名称更改为与下拉列表中的值相同(即两个 OrganisationID) - 正如您有帮助地指出的那样 - 现在它可以工作了!

      对于它的价值,对于其他任何人在我们的命名不一致以启用绑定时经历“绝望的编码器”和我所经历的挫折,这是我用来使下拉列表工作的方法(抱歉 - 不是使用Entity Framework,但如果使用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);
              }
      
      
          }
      

      查看

      @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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-20
        • 2013-06-21
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 1970-01-01
        相关资源
        最近更新 更多