定义要从视图传递到控制器的其他参数(使用 DropDownList)

本文关键字:参数 其他 使用 DropDownList 控制器 视图 定义 | 更新日期: 2023-09-27 17:55:56

>我使用脚手架模板在控制器和随附的视图中为我的模型类创建必要的部件 问题如图所示:

public class Question
    {
      [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int QuestionId { get; set; }
      [StringLength(250, ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "MaxCharsQuestionAchieved")]
      public string GeneralQuestion { get; set; }
      [StringLength(1000, ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName = "MaxCharsExplanationAchieved")]
      public string Explanation { get; set; }
      public bool IsTemplate { get; set; }
      public QuestionState QuestionState { get; set; }
      public DateTime DateSubmitted { get; set; }
      public DateTime? JudgementDate { get; set; }
      public virtual Regular Author { get; set; }
      public virtual List<Politician> AddressedPoliticians { get; set; }
      public virtual List<Topic> Topics { get; set; }
      public virtual Moderator LastEditor { get; set; }
      public virtual List<Attachment> Attachments { get; set; }
      public virtual List<Answer> Answers { get; set; }
      public virtual List<QuestionSubscription> QuestionSubscriptions { get; set; }

      public int FbShares { get; set; }
      public int FbLikes { get; set; }
      public int TwitterShares { get; set; }
      public int SiteVotes { get; set; }
}

我想更改创建视图的模板。如您所见,问题有一个已解决的政治家列表。我想向用户提供我数据库中所有政治家的下拉列表。该值必须是政治家的 ID,显示成员应该是他们的名字。当然,视图有一个类型为"问题"的模型。如何构建下拉列表并将所选值提供给我的创建(问题问题)操作结果方法,以便我可以将政治家从数据库中取出以将其添加到有问题的已解决的POliticians中?

我尝试摆弄ViewBag,但似乎无法让它工作。希望有人能给我一些提示/建议。

编辑:

我可能应该展示我已经尝试过的东西:)

操作结果方法:

public ActionResult Create()
    {
      ViewBag.PolIds = new SelectList(context.Politicians.ToList(), "UserId", "FirstName");
      return View();
    }
    //
    // POST: /Question/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Question question)
    {
      if (ModelState.IsValid)
      {
        var polId = ((SelectList)ViewBag.PolIds).SelectedValue;
        Politician pol = context.Politicians.Single(p => p.UserId == (int)polId);
        question.AddressedPoliticians.Add(pol);
        question.DateSubmitted = DateTime.Now;
        manager.CreateQuestion(question);
        return RedirectToAction("Index");
      }
      return View(question);
    }

Create.cshtml:

@model PoliticiOnline.DTO.Question
@{
    ViewBag.Title = "Stel een vraag!";
}
<h2>Stel een vraag!</h2>
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Vraag</legend>
        <div class="general-question">
            <div class="editor-label">
                @Html.LabelFor(model => model.GeneralQuestion, "Algemene Vraag")
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.GeneralQuestion)
                @Html.ValidationMessageFor(model => model.GeneralQuestion)
            </div>
        </div>
        <div class="geadresseerde-politici">
            @Html.Label("Politicus")
            @Html.DropDownList("PolIds", "Kies een politicus...")
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Explanation, "Extra Uitleg")
        </div>
        <div class="editor-field">
            @Html.TextAreaFor(model => model.Explanation)
            @Html.ValidationMessageFor(model => model.Explanation)
        </div>
        <p>
            <input type="submit" value="Indienen!" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

定义要从视图传递到控制器的其他参数(使用 DropDownList)

对于下拉列表:创建要从中选择的值作为列表和用于存储所选值的属性(可能是整数)。然后使用:

@Html.DropDownListFor(m => m.SelectedValue, Model.SelectListItems)

对于复选框列表,您应该添加一个列表或类似内容,其中包含选定的政治家 ID。然后添加一个复选框列表,其中名称='列表名称',值='政治家的id',当然还有名称作为关联标签的文本。

我自己的一个观点的例子:

<ul class="fields">
@foreach (var gender in Model.FilterData.Genders)
{
  <li class="field">
    <input id="gender@(gender.Id)" type="checkbox" name="Filters.Genders" value="@gender.Id" @(Model.Filters.Genders.Contains(gender.Id) ? "checked" : "") />
    <label for="gender@(gender.Id)">@gender.Name</label>
  </li>
}
</ul>

现在,我在我的 Model.FilterData 对象中有一个可供选择的性别列表,每个对象都有一个 ID 和一个 Name。我的模型中还有一个对象"过滤器",带有列表性别。因此,您可以看到每个复选框的名称为"Filters.Genders",即指向此列表。

如果希望只能选择一个,只需在模型中创建一个 int 属性,并将一系列单选按钮绑定到同一个 int 属性。再举一个例子:

<ul class="fields">
  @foreach (var function in Model.FilterData.Functions)
  {
    <li class="field">
      @Html.RadioButtonFor(m => m.Filters.FunctionId, function.Id)
      @Html.LabelFor(m => m.Filters.FunctionId, function.Name)
    </li>
  }
</ul>

这更容易,因为您可以使用帮助程序函数。如您所见,每个单选按钮都指向相同的模型属性(Filters.FunctionId) - 因此呈现的输入都将其作为其名称。

如果在GET方法中使用,您将看到它多次重复相同的属性(即Filters.Genders=2&Filters.Genders=4&Filters.Genders=5),这些属性将在您的操作中解析为List。

Question模型中添加一个字段:

[NotMapped]
public decimal PoliticianId { get; set; }

在您看来:

<div class="geadresseerde-politici">
            @Html.Label("Politicus")
@Html.DropDownListFor(model => model.PoliticianId, (SelectList)ViewBag.PolIds)
        </div>

在你的行动中:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Question question)
    {
      if (ModelState.IsValid)
      {
         var selectedPolitician = question.PoliticianId; // The selected politician id
      }
    }

编辑:

或者像 mjepson 在他的评论中提到的那样,您可以在不向Question模型添加字段的情况下执行此操作,例如:

在您看来:

<div class="geadresseerde-politici">
            @Html.Label("Politicus")
@Html.DropDownList("PoliticianId", (SelectList)ViewBag.PolIds)
        </div>

在你的行动中:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Question question, int PoliticianId) // PoliticianId will now have the selected value of the dropdown
    {
      if (ModelState.IsValid)
      {
         // do your stuff
      }
    }