选择SelectListItem进行建模

mis*_*hap 0 asp.net-mvc asp.net-mvc-3 drop-down-menu

我有一个List传递给我在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");
}
Run Code Online (Sandbox Code Playgroud)

模型:

[Required]
public String Reason { get; set; }
Run Code Online (Sandbox Code Playgroud)

教职员:

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

我需要创建一个下拉列表,也许DropDownList("reason")(应该是更好的编写方式)形成ViewBag.reasons并将选定的值传递给我的Model,作为属性String Reason.只是混淆了DropDownList/DropDownListFor的用法.谢谢!

Dar*_*rov 7

模型:

public class MyModel
{
    [Required]
    public String Reason { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

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

视图:

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

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

public class MyViewModel
{
    [Required]
    public string Reason { get; set; }

    public IEnumerable<SelectListItem> Reasons { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • @Chuchelo,好吧,我只是有义务指出好的做法.您可以忽略它们并继续使用ViewBag. (3认同)
  • ViewBag很糟糕的原因有很多.`ViewBag`是弱类型的.您没有编译时安全性.你没有Intellisense.使用ViewBag/ViewData真是太可怕了.但ViewBag最糟糕的事情是它反映了ASP.NET MVC中一个非常糟糕的做法:在视图中使用域模型而不是定义视图模型.您永远不应该将域模型传递给视图.控制器操作必须始终只从视图中传递视图模型并将视图传递给视图.视图模型是您对给定视图的域的一种投影. (3认同)