2

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

我有 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>
4

3 回答 3

1

最后我得到了一个自定义视图模型——这样我就可以工作了……

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

于 2012-11-30T15:58:58.687 回答
0

如果您的 Item 具有 CategoryId 属性:

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

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

或者使用强类型助手:

Html.DropDownListFor(x=>x.CategoryId...)
于 2012-11-25T01:57:18.730 回答
0

谢谢阿门。

我有同样的问题,我的下拉列表可以从数据库中填充,但是 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);
        }


    }

看法

@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>
于 2013-01-30T09:34:36.890 回答