0

イベントを作成するときに選択できるユーザートピックを表示するMVC3プロジェクトを作成しています。ただし、ドロップダウンリストから値を選択すると、フィールド「トピック」の値は常にnullになります。

クラスは次のとおりです。

public class VolunteerEvent
{
        public int VolunteerEventID { get; set; }   
        public DateTime VolunteerDate { get; set; }
        public int ZIPcode { get; set; }
        public int Hours { get; set; }
        public string Topic { get; set; }  
}

文字列を格納するダミークラス

public class VolunteerTopic
{
    public int VolunteerTopicID { get; set; }
    public string VolunteerTopicName { get; set; }
}

アクションを作成するためのコントローラー

  public ActionResult Create()
    {
        ViewBag.VolunteerTopicID = new SelectList(db.VolunteerTopics, "VolunteerTopicID", "VolunteerTopicName");
        return View();
    } 

//
// POST: /LogVolunteerEvent/Create
[HttpPost]
public ActionResult Create(VolunteerEvent volunteerevent)
{

    if (ModelState.IsValid)
    {
        db.VolunteerEvents.Add(volunteerevent);
        db.SaveChanges();
        return RedirectToAction("Index");  
    }
    ViewBag.VolunteerTopics = new SelectList(db.VolunteerTopics, "VolunteerTopicID", "VolunteerTopicName", 
        volunteerevent.Topic);

    return View(volunteerevent);
}

およびビューの関連部分

<div class="editor-label">
            @Html.LabelFor(model => model.Topic)
        </div>
        <div class="editor-field">
            @Html.DropDownList("VolunteerTopicID")
            @Html.ValidationMessageFor(model => model.Topic)
        </div>

興味のある人のためのhtmlの結果

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Create</title>
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/modernizr-2.5.3.js" type="text/javascript"></script>
</head>
<body>
    <div class="page">

<h2>Create</h2>

<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

<form action="/logvolunteerEvent/Create" method="post">    <fieldset>
        <legend>VolunteerEvent</legend>

        <div class="editor-label">
            <label for="VolunteerDate">VolunteerDate</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" data-val="true" data-val-required="The VolunteerDate field is required." id="VolunteerDate" name="VolunteerDate" type="text" value="" />
            <span class="field-validation-valid" data-valmsg-for="VolunteerDate" data-valmsg-replace="true"></span>
        </div>

        <div class="editor-label">
            <label for="ZIPcode">ZIPcode</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" data-val="true" data-val-number="The field ZIPcode must be a number." data-val-required="The ZIPcode field is required." id="ZIPcode" name="ZIPcode" type="text" value="" />
            <span class="field-validation-valid" data-valmsg-for="ZIPcode" data-valmsg-replace="true"></span>
        </div>

        <div class="editor-label">
            <label for="Hours">Hours</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" data-val="true" data-val-number="The field Hours must be a number." data-val-required="The Hours field is required." id="Hours" name="Hours" type="text" value="" />
            <span class="field-validation-valid" data-valmsg-for="Hours" data-valmsg-replace="true"></span>
        </div>

        <div class="editor-label">
            <label for="Topic">Topic</label>
        </div>
        <div class="editor-field">
            <select id="VolunteerTopicID" name="VolunteerTopicID">
<option value="1">      Advocacy</option>
...a bunch of values...
</select>
            <span class="field-validation-valid" data-valmsg-for="Topic" data-valmsg-replace="true"></span>
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
</form>
<div>
    <a href="/logvolunteerEvent">Back to List</a>
</div>

        </section>
        <footer>
        </footer>
    </div>
</body>
</html>
4

2 に答える 2

0

私はあなたが物事を間違っていると思います、これはあなたがすべき方法です:

モデル:

public class VolunteerEvent
{
    // other fields
    public int TopicId { get; set; }  
}

意見:

@model VolunteerEvent

(inside some form)
@Html.DropDownListFor(m => m.TopicId, new SelectList(aListOfTopics, "Id", "Name"))

Topic(これは、列がIdおよびであるオブジェクトのリスト用ですName)

コントローラ:

[HttpPost]
public void Create(VolunteerEvent volunteerEvent, FormCollection collection)
{
    var topicId = volunteerEvent.TopicId;
    // do something
    // you can also get the value from collection["TopicId"]
}
于 2013-01-07T20:21:13.463 に答える
0

ここでの問題は、DropdownリストがバインドされてVoluteerTopicId,いるが、投稿アクションに渡すモデルの一部ではないことです。

ここで機能させるための最も簡単な修正は、ビューモデルを作成することです:

public class VolunteerViewModel
{
  public VolunteerEvent VolunteerEvent {get; set;}
  public VolunteerTopic {get; set;}
}

代わりに、このビューモデルにビューを強く入力し、VolunteerEventそれに応じてリファクタリングします。

次に、投稿アクションの署名を次のように変更しますpublic ActionResult Create(VolunteerViewModel viewModel)

これで、リストがモデルにバインドされ、選択した値にアクセスできるようになりますviewModel.VolunteerTopic.VolunteerTopicId

于 2013-01-07T20:34:18.143 に答える