0

我正在编写一个 MVC3 项目,该项目显示创建事件时可供选择的用户主题。但是,每当从下拉列表中选择一个值时,“主题”字段的值始终为空。

这是课程:

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对象列表IdName

控制器:

[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,但这不是您传递给 post 操作的模型的一部分。

最快的解决方法是创建一个视图模型:

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 回答