ありがとうアーメン。
ドロップダウンリストがデータベースから正常に読み込まれるという同じ問題がありましたが、新しいレコードが作成されたときに OrganizationID (私の場合) がデータベースに作成されませんでした (私の場合は常に 0 のみがキャプチャされました) - 変更するまでViewBag の名前は、ドロップダウンの値 (つまり、OrganisationID の両方) と同じにする必要があります。
価値のあるものとして、「Desperate coder」というフラストレーションを経験している他の人のために、バインディングを有効にするためのネーミングが一貫していなかったときに私が経験したことについて、ドロップダウンリストを機能させるために私が使用したものを次に示します (申し訳ありませんが、エンティティは使用しません)。フレームワークですが、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>