2

私はここではまったく新しいユーザーですが、次の問題を解決するために2、3時間を探しています。

カテゴリとアイテムの2つのエンティティがあります。各アイテムはカテゴリに属している必要があります。したがって、新しいアイテムを作成するときに既存のすべてのカテゴリを表示するDropDownListが必要です。これまでのところ、私のコードはすべてのカテゴリを含むDropDownListを示していますが、カテゴリを選択してフォーム(POST)を送信すると、Categoryの値は常にnullになります。カテゴリはnull許容ではないため、これにより当然ModelState.IsValidがfalseになります。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

ありがとうアーメン。

ドロップダウンリストがデータベースから正常に読み込まれるという同じ問題がありましたが、新しいレコードが作成されたときに 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>
于 2013-01-30T09:34:36.890 に答える
0

Item に CategoryId プロパティがある場合:

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

が値を正しくバインドできるように、DropDownListtoという名前を付ける必要があります。"CategoryId"ModelBinder

または、強く型付けされたヘルパーを使用します。

Html.DropDownListFor(x=>x.CategoryId...)
于 2012-11-25T01:57:18.730 に答える