【问题标题】:How do I set attribute on cshtml (razor)?如何在 cshtml(剃须刀)上设置属性?
【发布时间】:2012-07-30 15:21:13
【问题描述】:

我想根据我的后端数据设置“已选择”选项。这是我的代码示例...

<select id="listName" name="listName">
    <option>Select Name</option>
        @foreach (var item in ViewBag.NameList as Dictionary<string, string>)
        {                
            //worked in MVC2, not with razor
            <option value= '@item.Key' @if (TempData["name"].ToString() == item.Key) { selected = "&quot;selected&quot;"); }>@item.Value - @item.Key</option> 

            string nameSelect = TempData["name"].ToString() == item.Key ? "selected" : "";
            <option value= '@item.Key' selected= '@nameSelect'>@item.Value - @item.Key</option>                           
        }
</select>

有没有更好的方法来做到这一点?

【问题讨论】:

  • 呃,这是什么? Html.DropDownListFor 怎么样?视图模型呢?
  • 看到这个related SO post。

标签: c# .net asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

有没有更好的方法来做到这一点?

哦,该死的。当然使用视图模型。所以让我们定义一个视图模型:

public class MyViewModel
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Values { get; set; }
}

然后是一个控制器动作,它将从您的数据源填充此视图模型:

public ActionResult SomeAction()
{
    var model = new MyViewModel();

    // preselect an item with Value=2
    model.SelectedValue = "2"; 

    // this could of course come from a database or something
    model.Values = new[]
    {
        new SelectListItem { Value = "1", Text = "item 1" },
        new SelectListItem { Value = "2", Text = "item 2" },
        new SelectListItem { Value = "3", Text = "item 3" },
    };

    return View(model);
}

最后是对应的强类型视图:

@model MyViewModel
....


@Html.DropDownListFor(x => x.SelectedValue, Model.Values, "Select")

现在,由于您在问题中显示了一些字典,我们可以假设您已经拥有这本字典。在您的示例中,您已将其填充到 ViewBag 中(这是错误的),但您可以将其绑定到视图模型:

public ActionResult SomeAction()
{
    Dictionary<string, string> values = ......

    var model = new MyViewModel();
    model.SelectedValue = (string)TempData["name"]; 
    model.Values = values.Select(x => new SelectListItem
    {
        Value = x.Key,
        Text = string.Format("{0} {1}", x.Key, x.Value)
    });

    return View(model);
}

这就是 ASP.NET MVC:强类型、视图模型、没有 ViewBag。

【讨论】:

  • 我的前端开发人员,只编写 html 代码,发现我们这样编写代码很困难
  • 您的前端开发人员了解 CSS 吗?如果他们这样做(如果他们称自己为前端开发人员,他们应该这样做)然后只需为下拉列表分配一个 CSS 类:@Html.DropDownListFor(x =&gt; x.SelectedValue, Model.Values, "Select", new { @class = "values" }),然后为您的前端开发人员提供 .value 类。以您的方式编写 ASP.NET MVC 视图是绝对的犯罪。因此,如果您想以正确的方式执行 ASP.NET MVC,您应该真正考虑使用视图模型。否则你会受很多苦。这段代码绝对是维护的噩梦。
  • 他们不知道@Html.DropDownListFor 有过载,new { @class = "values" } 的方式与 html 有点远。是的,你说得对,我一直在想这个噩梦,并没有找到一个完美的解决方案,前端开发人员不需要学习额外的 C# 语法
  • 您应该真正区分不同的角色:网页设计师(处理 CSS 并且只关心最终标记)和应该了解所使用技术的前端开发人员。在您的案例中使用的技术称为 Razor。如果您的前端开发人员不了解 Razor,那么请不要称他为前端开发人员,而应聘请了解底层技术的开发人员。我说这些真的是为了你自己/公司的利益。当然,你可以继续编写糟糕的意大利面条式代码,但这会在维护方面付出巨大的代价。
  • 它们都是我正在做的事情的好答案,但作为一个新手开发人员,我正在努力清理我的代码。感谢@allentranks 和 Darin Dimitrov 的洞察力。
【解决方案2】:

除了@Html.DropDownListFor,你可以这样编码:

<option value= '@item.Key' @(TempData["name"].ToString() == item.Key ? "selected" : "")>@item.Value - @item.Key</option> 

顺便说一句,我不喜欢@Html.DropDownListFor ..

【讨论】:

  • 它们都是我正在做的事情的好答案,但作为一个新手开发人员,我正在努力清理我的代码。感谢 allentranks 和 @Dimitrov 的洞察力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多