Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC选择列表和回发时的模型,如何?_C#_Asp.net Mvc 3_Razor - Fatal编程技术网

C# MVC选择列表和回发时的模型,如何?

C# MVC选择列表和回发时的模型,如何?,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,我正在尝试创建一个视图,该视图需要两个带有MVC3的下拉列表。在我唯一的另一个MVC应用程序中,我们使用Telerik控件,该控件使用Ajax方法填充数据。现在在这个项目中,我们不使用第三方控件,所以我将使用MVCSelectList作为下拉列表。我已经阅读了很多关于如何填充SelectList的文章,但没有一篇文章重复了同样的内容,总是以不同的方式创建模型,有些人使用ViewData或ViewBag保存集合并传递给视图,等等。。没有一致性 在使用模型本身而不是ViewData来填充数据的MVC

我正在尝试创建一个视图,该视图需要两个带有MVC3的下拉列表。在我唯一的另一个MVC应用程序中,我们使用Telerik控件,该控件使用Ajax方法填充数据。现在在这个项目中,我们不使用第三方控件,所以我将使用MVC
SelectList
作为下拉列表。我已经阅读了很多关于如何填充
SelectList
的文章,但没有一篇文章重复了同样的内容,总是以不同的方式创建模型,有些人使用
ViewData
ViewBag
保存集合并传递给视图,等等。。没有一致性

在使用模型本身而不是
ViewData
来填充数据的MVC视图中的下拉列表的最佳方法是什么。当用户从列表中进行选择、提交并调用
HttpPost
操作时,我如何从select list属性的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; }
}
这是我当前的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);
}

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; }
}

继续评论

假设您有一个名为
Toy
的模型。玩具的属性有
名称
价格
类别

public class Toy()
{
    public string Name;
    public double Price;
    public string Category
}
现在您需要构建一个表单视图来添加一个
玩具
,人们需要能够从下拉列表中选择一个类别。。。但出于某种原因,您不希望通过
ViewData
ViewBag
执行此操作

不要将模型传递给视图,而是创建一个具有
名称
价格
类别
ToyViewModel
。。。但也有一个类别集合来填充下拉列表:

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

    public ICollection<string> Categories;
}
您的视图绑定到ViewModel,您可以使用
model.Categories
集合填充下拉列表。
它应该类似于:

@Html.DropDownListFor(model => model.Category, model.Categories)
[HttpPost]
public ActionResult CreateToy(ToyViewModel _viewModel)
{
    var model = new Toy();
    model.Name = _viewModel.Name
    // etc.

    _service.CreateToy(model);

    // return whatever you like.
    return View();
}
提交时,控制器会执行以下操作:

@Html.DropDownListFor(model => model.Category, model.Categories)
[HttpPost]
public ActionResult CreateToy(ToyViewModel _viewModel)
{
    var model = new Toy();
    model.Name = _viewModel.Name
    // etc.

    _service.CreateToy(model);

    // return whatever you like.
    return View();
}

制作视图模型以绑定到视图是一种很好的做法,这样您就可以根据表示层的需要对其进行定制,同时使模型保持接近数据层和业务逻辑。

好的,所以当我发回时,我假设您的意思是模型中的EntityType将设置为EntityType的选定值?在我对控制器的Get method操作中,我假设我只需要实例化一个新的viewmodel,获取EntityTypes集合,并将它们设置为myModel.EntityTypes的值,以便将它们传递到视图?@CDSmith-NickLarsen是对的,但这里的关键是您应该为视图创建一个viewmodel。。。此视图模型应具有模型属性和用于填充下拉列表的选项/选项的列表/集合。直接传递模型是一种不好的做法。@one.beat.consumer。。你是说我的行动方法正确吗?你能举例说明你的意思吗?我想我知道你的评论是怎么说的,但我想澄清一下。。。thanks@one.beat.consumer你直接通过是什么意思?哪个是哪个?我猜他的意思是应该有两个模型,一个用于视图,一个用于表单。表单模型应该只包含表单可以返回的字段,视图模型应该包含构建视图所需的所有内容。有很多方法可以将表单放到视图中,通常是将表单模型作为视图模型的属性。当然,这取决于@one.beat.consumer来确认他的意图。感谢您的澄清,这正是我正在使用的架构类型。需求实际上让我使用了3种不同的模型,ViewModel,一种在发布时从ViewModel转换而来的业务实体模型,以及一种针对轻量级网络流量的DTO。@one.beat.consumer我看不出这与原始发布有什么不同。原始帖子中的视图模型是
临时注册
,实体/持久化模型是
临时注册实体
。这个答案与原来的答案唯一不同的是,你的答案省略了元数据,并使用了与我使用过的完全相同的模式来包含类别,这就是问题的内容……谢谢,你们两人一起帮助我看到了整个情况,看起来我的做法是正确的。临时注册确实是我的商业模式,而临时注册只是视图模式。为了清晰起见,我将其重命名为TemporaryRegistrationViewModel。@NickLarsen
1。
对我来说,不清楚我们是如何使用他的模型的。
2。
我们的帖子之间的区别是我提供了关于建模的解释,而你没有。我开始在你的答案帖子上的评论中解释这一点,因为我觉得这很重要,但不想“窃取你的答案”。显然没有足够的空间。如果你想获得荣誉,我没问题。为了记录在案,早在我发布自己的任何东西之前,我就已经知道了你的答案和你的第一条评论。
[HttpPost]
public ActionResult CreateToy(ToyViewModel _viewModel)
{
    var model = new Toy();
    model.Name = _viewModel.Name
    // etc.

    _service.CreateToy(model);

    // return whatever you like.
    return View();
}