dropdownlist在MVC3 Razor中设置选定的值

时间:2011-07-24 14:03:41

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

这是我的模特:

public class NewsCategoriesModel {
    public int NewsCategoriesID { get; set; }        
    public string NewsCategoriesName { get; set; }
}

我的控制器:

public ActionResult NewsEdit(int ID, dms_New dsn) {
    dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
    var categories = (from b in dc.dms_NewsCategories select b).ToList();
    var selectedValue = dsn.NewsCategoriesID;
    SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue);

    // ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID);
    ViewBag.NewsCategoriesID = ListCategories;
    return View(dsn);
}

然后我的观点:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)

当我跑步时,DropDownList没有选择我设定的值。它总是选择第一个选项。

10 个答案:

答案 0 :(得分:97)

您应该使用视图模型并忘记ViewBag将其视为不存在。你会看到事情会变得多么容易。所以定义一个视图模型:

public class MyViewModel
{
    public int SelectedCategoryId { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; } 
}

然后从控制器填充此视图模型:

public ActionResult NewsEdit(int ID, dms_New dsn)
{
    var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
    var categories = (from b in dc.dms_NewsCategories select b).ToList();

    var model = new MyViewModel
    {
        SelectedCategoryId = dsn.NewsCategoriesID,
        Categories = categories.Select(x => new SelectListItem
        {
            Value = x.NewsCategoriesID.ToString(),
            Text = x.NewsCategoriesName
        })
    };
    return View(model);
}

最后在您的视图中使用强类型DropDownListFor帮助程序:

@model MyViewModel

@Html.DropDownListFor(
    x => x.SelectedCategoryId,
    Model.Categories
)

答案 1 :(得分:21)

以防万一有人提出这个问题,我就是这样做的,请忘记存储库对象,我正在使用存储库模式,你可以使用你的对象上下文来检索实体。并且也不注意我的实体名称,我的实体类型Action与MVC Action无关。

控制器:

ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId);

注意SelectList构造函数的最后一个变量是选中的值(object selectedValue)

然后这是我的观点来渲染它:

<div class="editor-label">
   @Html.LabelFor(model => model.ActionStatusId, "ActionStatus")
</div>
<div class="editor-field">
   @Html.DropDownList("ActionStatusId")
   @Html.ValidationMessageFor(model => model.ActionStatusId)
</div> 

我认为这很简单,我希望这有帮助! :)

答案 2 :(得分:8)

在控制器中非常简单,你有这样的事情:

- 控制器

ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id);

- 查看(选项A)

@Html.DropDownList("Profile_Id")

- 查看(选项B) - &gt;将空值发送到列表

@Html.DropDownList("Profile_Id", null, "-- Choose --", new {  @class = "input-large" })

答案 3 :(得分:8)

我深入研究了下拉列表的形成,而不是使用@Html.DropDownList()。如果您必须在运行时在razor而不是controller中设置下拉列表的值,这将非常有用:

<select id="NewsCategoriesID" name="NewsCategoriesID">
    @foreach (SelectListItem option in ViewBag.NewsCategoriesID)
    {
        <option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected='selected'" : "")>@option.Text</option>

    }
</select>

答案 4 :(得分:6)

使用新的更新工作代码替换以下行:

EEE MMM d HH:mm:ss yyyy

现在实施新的更新工作代码

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)

答案 5 :(得分:5)

我想在这里提出正确答案,以防其他人像我一样遇到这个问题。如果你讨厌ViewBag,可以不使用它,但问题中代码的真正问题是,如@RickAndMSFT指出的那样,模型属性和选择列表使用相同的名称

只需更改DropDownList控件的名称就可以解决问题,如下所示:

@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)

与使用ViewBag或不使用ViewBag实际上没有任何关系,因为无论如何都可能与控件发生名称冲突。

答案 6 :(得分:3)

我更喜欢DropDownList助手的lambda形式 - 请参阅MVC 3 Layout Page, Razor Template, and DropdownList

如果您想使用SelectList,我认为此错误报告可能有所帮助 - http://aspnet.codeplex.com/workitem/4932

答案 7 :(得分:2)

代码吼叫,get from,去

控制器:

int DefaultId = 1;
ViewBag.Person = db.XXXX
        .ToList()
        .Select(x => new SelectListItem {
            Value = x.Id.ToString(),
            Text = x.Name,
            Selected = (x.Id == DefaultId)
        });

查看:

@Html.DropDownList("Person")

注意: ViewBag。和@ Html.DropDownList(&#34; &#34;)名称应与视图模型一样

答案 8 :(得分:1)

要选择IT部门,当从tblDepartment表加载部门时,请使用以下SelectList类的重载构造函数。请注意,我们为selectedValue参数传递了值1。

ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");

答案 9 :(得分:0)

对于不想使用dropdownlistfor的人,这是我在jQuery中通过.NET MVC设置的方法。

  1. 前端Javascript->从模型中获取数据:
    var settings = @Html.Raw(Json.Encode(Model.GlobalSetting.NotificationFrequencySettings)); 

    SelectNotificationSettings(settings);

    function SelectNotificationSettings(settings) {
                $.each(settings, function (i, value) {
                    $("#" + value.NotificationItemTypeId + " option[value=" + value.NotificationFrequencyTypeId + "]").prop("selected", true);
                });
    }
  1. 在razor html中,您将没有几个下拉列表
 @Html.DropDownList(NotificationItemTypeEnum.GenerateSubscriptionNotification.ToString,
    notificationFrequencyOptions, optionLabel:=DbRes.T("Default", "CommonLabels"),
    htmlAttributes:=New With {.class = "form-control notification-item-type", .id = Convert.ToInt32(NotificationItemTypeEnum.GenerateSubscriptionNotification)})

当页面加载时,您的js函数将基于存储在@model中的值来设置所选选项。

干杯。