MVC选择List with model with postback,怎么样?

时间:2012-01-05 19:06:10

标签: c# asp.net-mvc-3 razor

我正在尝试创建一个需要2个下拉列表和MVC 3的视图。在我唯一的其他MVC应用程序中,我们使用了使用Ajax方法填充数据的Telerik控件。现在在这个项目上我们不使用第三方控件,所以我将使用MVC SelectList进行下拉菜单。我一直在阅读很多关于如何填充SelectList的文章,但是他们都没有说过两次同样的事情,总是以不同的方式来创建模型,有些使用ViewData或{{1}保存集合并传递给视图等。没有一致性。

在MVC视图中填充下拉列表的最佳接受方法是什么,该方法将模型本身用于数据,而不是ViewBag。当用户从列表中进行选择,提交并调用ViewData操作时,如何从选择列表属性的Model属性中访问所选值?

这是我目前的模特:

HttpPost

这是我目前的观点,它只使用public class TemporaryRegistration { [Required] [Email(ErrorMessage = "Please enter a valid email address.")] [Display(Name = "Email address")] public string Email { get; set; } [Required] [Integer] [Min(1, ErrorMessage = "Please select an entity type.")] [Display(Name = "Entity Type")] public IEnumerable<SelectListItem> EntityType { get; set; } [Required] [Integer] [Min(1, ErrorMessage = "Please select an associated entity.")] [Display(Name = "Associated Entity")] public IEnumerable<SelectListItem> AssociatedEntity { get; set; } } 我需要使用下拉列表,如何将它们转换为下拉列表?

TextBoxFor

这是我目前的Post动作: 如何获取所选值?

@model Web.Models.TemporaryRegistration

<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.ValidationSummary(true)
    <fieldset>
    <legend>Create New ELM Select User</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Email)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.EntityType)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.EntityType)
            @Html.ValidationMessageFor(model => model.EntityType)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.AssociatedEntity)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AssociatedEntity)
            @Html.ValidationMessageFor(model => model.AssociatedEntity)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

2 个答案:

答案 0 :(得分:8)

继续发表评论......

假设您有一个名为Toy的模型。玩具具有NamePriceCategory

等属性
public class Toy()
{
    public string Name;
    public double Price;
    public string Category
}

现在您要构建一个表单视图以添加Toy,人们需要能够从可能性的下拉列表中选择一个类别......但您不希望通过{ {1}}或ViewData由于某种原因。

不是将模型传递给视图,而是创建一个ViewBag,其中包含ToyViewModelNamePrice ...但有一组类别来填充下拉列表:

Category

现在您的控制器执行此操作:

public class ToyViewModel()
{
    public string Name;
    public double Price;
    public string Category

    public ICollection<string> Categories;
}

您的视图已绑定到ViewModel,并使用public ActionResult GetToyForm() { var viewModel = new ToyViewModel(); viewModel.Categories = _service.GetListOfCategories(); return View(viewModel); } 集合填充您的下拉列表。它应如下所示:

model.Categories

提交时,您的控制器会执行以下操作:

@Html.DropDownListFor(model => model.Category, model.Categories)

最好将ViewModel用于绑定到Views,这样您就可以根据表示层的需要定制它们,同时让模型保持接近数据层和业务逻辑。

答案 1 :(得分:2)

除非您接受多个值(例如列表框将发送),否则EntityType不需要是列表。当您在视图上显示下拉列表(通常只选择单个值)时,您只需要以其他方式为其提供选项,例如在视图模型的另一个属性中发送列表。

public class TemporaryRegistration {
        [Required]
        [Email(ErrorMessage = "Please enter a valid email address.")]
        [Display(Name = "Email address")]
        public string Email { get; set; }

        [Required]
        [Integer]
        [Min(1, ErrorMessage = "Please select an entity type.")]
        [Display(Name = "Entity Type")]
        public int EntityType { get; set; }

        public IEnumerable<SelectListItem> EntityTypes { get; set; }

        [Required]
        [Integer]
        [Min(1, ErrorMessage = "Please select an associated entity.")]
        [Display(Name = "Associated Entity")]
        public IEnumerable<SelectListItem> AssociatedEntity { get; set; }
}

然后使用下拉列表帮助器。

@Html.DropDownListFor(model => model.EntityType, model.EntityTypes)