【问题标题】:@Html.DropDownList issue in razor view?剃刀视图中的@Html.DropDownList 问题?
【发布时间】:2013-01-31 14:23:45
【问题描述】:

我有一个响应提交按钮的表单。

我的菜单下拉列表如下:

@Html.DropDownList("State", new List<SelectListItem>
{
    new SelectListItem { Text = "Please select" }, 
    new SelectListItem { Value = "AL", Text="Alabama" }, ....
    new SelectListItem { Value = "WY", Text="Wyoming" })

如何在我的模型中将选定的值作为 bool 或最好作为字符串 ..

我需要验证

[Required(ErrorMessage = "Please select a state.")]
public string/bool State { get; set; }

请帮忙。

谢谢

【问题讨论】:

  • 这比它应该的要复杂。更好的是,您可以在 Action Partial 中创建它。这样您就可以在操作方法中创建选择列表

标签: asp.net asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-4


【解决方案1】:

如何将选定的值设为 bool

将状态名称绑定到布尔变量几乎没有意义。

改用字符串:

public class MyViewModel
{
    [Required(ErrorMessage = "Please select a state.")]
    public string State { get; set; }
}

那么你可以有一个控制器:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
        {
            // there was a validation error - probably the user didn't select a state
            // => redisplay the view so that he can fix the error
            return View(model);
        }

        // at this stage the model is valid
        // you could use the model.State property that will hold the selected value
        return Content("Thanks for selecting state: " + model.State);
    }
}

最后你会得到一个对应的强类型视图:

@model MyViewModel
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.State)
        @Html.DropDownListFor(
            x => x.State,
            new[]
            {
                new SelectListItem { Text = "Please select" }, 
                new SelectListItem { Value = "AL", Text="Alabama" },
                .....
                new SelectListItem { Value = "WY", Text="Wyoming" }
            },
            "-- select a state --"
        )
        @Html.ValidationMessageFor(x => x.State)
    </div>
    <button type="submit">OK</button>
}

【讨论】:

  • 哦,完全错过了布尔部分。在 Action 部分中创建它不是最好的吗?
  • 我看不出部分与问题有什么关系。
  • 省去了在视图中创建选择列表的麻烦。必须在 View 上创建模型部件似乎不合适
  • 你认为局部是什么?这是一个视图。如果您想遵循最佳做法,则应在控制器中填写此国家/地区列表。
  • 是的,这就是我的意思。一个动作驱动的部分,因此在控制器中创建选择列表
【解决方案2】:

您想使用模型绑定助手

@model MVC4.Models.Model

然后

@Html.DropDownListFor(m=>m.State, new List<SelectListItem>
new SelectListItem { Text = "Please select" }, 
    new SelectListItem { Value = "AL", Text="Alabama" }, ....
    new SelectListItem { Value = "WY", Text="Wyoming" })

【讨论】:

  • 我几乎可以肯定我尝试过这个,但上次它不起作用,因为我的其他 textboxfor 属性以相同的方式绑定......谢谢。
  • 考虑进一步重构您的代码以使用@Action Partial -- 或者正如 Darin 正确地将其称为“子操作”。这样你就可以在你的控制器中创建你的选择列表,而不是“弄脏”你的视图。
【解决方案3】:

对于“请选择”项,您需要设置一个空字符串的值。如果你不这样做,IIRC,ValueText 将呈现相同的(所以你需要的验证器认为有一个值)。

模型中的State 属性应该是string

【讨论】:

  • 谢谢 .. 有道理。我删除并使用我的状态作为默认选择值。这样即使他们没有选择任何州,我也不必担心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多