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

CD *_*ith 4 c# razor asp.net-mvc-3

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

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

这是我目前的型号:

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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我目前的观点,它只使用TextBoxFor我需要使用下拉列表的地方,如何将它们变成下拉列表?

@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>
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
public ActionResult CreateUser(TemporaryRegistration registrationModel) {
    string newRegistrationGUID = string.Empty;
    if (!ModelState.IsValid) {
        return View();
    }

    TemporaryRegistrationEntity temporaryRegistration = null;
    temporaryRegistration = new TemporaryRegistrationEntity(registrationModel.Email, registrationModel.EntityType, registrationModel.AssociatedEntity);
    newRegistrationGUID = temporaryRegistration.Save();
    return Content("New registration was created with GUID " + newRegistrationGUID);
}
Run Code Online (Sandbox Code Playgroud)

one*_*mer 8

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

假设你有一个名为的模型Toy.玩具有样特性Name,Price以及Category:

public class Toy()
{
    public string Name;
    public double Price;
    public string Category
}
Run Code Online (Sandbox Code Playgroud)

现在你想构建一个表单视图来添加一个Toy,人们需要能够从可能性的下拉列表中选择一个类别......但你不想通过ViewDataViewBag出于某种原因这样做.

相反,经过模型视图中创建一个ToyViewModel具有Name,Price,Category...但有一个类的集合来填充下拉:

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

    public ICollection<string> Categories;
}
Run Code Online (Sandbox Code Playgroud)

现在你的控制器这样做了:

public ActionResult GetToyForm()
{
    var viewModel = new ToyViewModel();
    viewModel.Categories = _service.GetListOfCategories();
    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)

您的视图绑定到ViewModel,并使用该model.Categories集合填充您的下拉列表.它应该看起来像:

@Html.DropDownListFor(model => model.Category, model.Categories)
Run Code Online (Sandbox Code Playgroud)

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

[HttpPost]
public ActionResult CreateToy(ToyViewModel _viewModel)
{
    var model = new Toy();
    model.Name = _viewModel.Name
    // etc.

    _service.CreateToy(model);

    // return whatever you like.
    return View();
}
Run Code Online (Sandbox Code Playgroud)

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