【问题标题】:Selected SelectListItem to model选择要建模的 SelectListItem
【发布时间】:2012-04-19 13:01:25
【问题描述】:

我有一个列表要传递给我在 ViewBag 中的视图:

public ActionResult ContactUs()
    {
        List<SelectListItem> reasons = new List<SelectListItem>();
        reasons.Add(new SelectListItem
        {
            Selected = true,
            Text = "Billing/Payment question",
            Value = "Billing/Payment question"
        });
        reasons.Add(new SelectListItem
        {
            Text = "Complaint",
            Value = "Complaint"
        });

        ViewBag.reasons = reasons;
        return View();
    }

[HttpPost]
public ActionResult ContactUs(ContactUs form)
{
    //some code
    return View("ContactUs");
}

型号:

[Required]
public String Reason { get; set; }

查看:

@model #####.ViewModels.ContactUs
@using (Html.BeginForm("ContactUs","Home", FormMethod.Post))
{
   @Html.DropDownListFor(Model => Model.Reason,  (IEnumerable<SelectListItem>) ViewBag.reasons);
}

我需要创建一个下拉列表,也许 DropDownList("reasons") (应该是更好的写法)形成 ViewBag.reasons 并将 selected 值传递给我的模型,作为属性字符串原因。只是对 DropDownList/DropDownListFor 的使用感到困惑。 谢谢!

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 drop-down-menu


    【解决方案1】:

    型号:

    public class MyModel
    {
        [Required]
        public String Reason { get; set; }
    }
    

    控制器:

    public ActionResult Index()
    {
        var reasons = new List<SelectListItem>();
        reasons.Add(new SelectListItem
        {
            Selected = true,
            Text = "Billing",
            Value = "Billing"
        });
        reasons.Add(new SelectListItem
        {
            Text = "Complaint",
            Value = "Complaint"
        });
        ViewBag.reasons = reasons;
        return View(new MyModel());
    }
    

    查看:

    @model MyModel
    ...
    @Html.DropDownListFor(
        x => x.Reason, 
        (IEnumerable<SelectListItem>)ViewBag.reasons,
        "-- select a reason --"  
    )
    

    但我建议您摆脱 ViewBag 并使用真实视图模型:

    public class MyViewModel
    {
        [Required]
        public string Reason { get; set; }
    
        public IEnumerable<SelectListItem> Reasons { get; set; }
    }
    

    然后控制器动作将填充视图模型并将其传递给视图:

    public ActionResult MyAction()
    {
        var reasons = new List<SelectListItem>();
        reasons.Add(new SelectListItem
        {
            Text = "Billing",
            Value = "Billing"
        });
        reasons.Add(new SelectListItem
        {
            Text = "Complaint",
            Value = "Complaint"
        });
    
        var model = new MyViewModel
        {
            // Notice how I am using the Reason property of the view model
            // to automatically preselect a given element in the list
            // instead of using the Selected property when building the list
            Reason = "Billing",
            Reasons = reasons
        };
    
        return View(model);
    }
    

    最后在你的强类型视图中:

    @model MyViewModel
    ...
    @Html.DropDownListFor(
        x => x.Reason,
        Model.Reasons,
        "-- select a reason --"  
    )
    

    【讨论】:

    • 我知道你的意思,但是对于这种情况,只需要在 ViewBag 中传递列表。非常感谢。
    • @Chuchelo,好吧,我有义务指出好的做法。当然,您可以忽略它们并继续使用 ViewBag。
    • 我得到与以前相同的错误:“没有类型为 'IEnumerable' 的 ViewData 项具有键 'Reason'。”知道为什么吗?代码已编译。
    • 您的 DropDownList 调用在视图中看起来如何?您使用的是DropDownList 还是DropDownListFor
    • ViewBag 不好的原因有很多。 ViewBag 是弱类型的。您没有编译时安全性。你没有智能感知。使用 ViewBag/ViewData 实在是太可怕了。但 ViewBag 最糟糕的地方在于,它反映了 ASP.NET MVC 中一个非常糟糕的做法:在视图中使用域模型而不是定义视图模型。您永远不应该将域模型传递给视图。控制器操作必须始终只从视图中获取和传递视图模型。视图模型是给定视图的域的一种投影。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2011-05-30
    • 2018-01-27
    • 2018-11-21
    • 2020-11-05
    相关资源
    最近更新 更多