【问题标题】:MVC 5 EF 6 EditorFor Dropdown List Change Text displayedMVC 5 EF 6 EditorFor 下拉列表更改显示的文本
【发布时间】:2016-02-02 19:52:15
【问题描述】:

我有一组简单的数据,从 SQL 表到 HTML.EditorFor 助手。 我遇到的问题是数据库中的记录是布尔值,我需要根据值是 1 还是 0 来显示一串文本。

我的编辑器模板如下所示:

@model nData.DAL.tblTaggingGroupInstance
<td>
    @Html.DisplayFor(modelItem => modelItem.WeekDay)
</td>
<td>
    @Html.DisplayFor(modelItem => modelItem.Segment)
</td>

<td>
    @Html.DisplayFor(modelItem => modelItem.NetSales)
</td>
<td>
    @Html.DisplayFor(modelItem => modelItem.SwellSales)
</td>
<td>
    @Html.DisplayFor(modelItem => modelItem.SpikeSales)
</td>
<td>
    @Html.EditorFor(modelItem => modelItem.Recurring)
</td>
<td>
    @Html.EditorFor(modelItem => modelItem.tblTaggingReasonID)
</td>
<td>
    @Html.EditorFor(modelItem => modelItem.Comment)
</td>

我的模特是:

public partial class tblTaggingGroupInstance
{
    public int ID { get; set; }
    public int tblTaggingGroupID { get; set; }
    public int FinYear { get; set; }
    public int FinWeek { get; set; }
    public int WeekDay { get; set; }
    public Nullable<int> tblTaggingReasonID { get; set; }
    public Nullable<decimal> NetSales { get; set; }
    public Nullable<decimal> SwellSales { get; set; }
    public Nullable<decimal> SpikeSales { get; set; }
    public string Comment { get; set; }
    public string Segment { get; set; }
    public Nullable<bool> Recurring { get; set; }
    public Nullable<decimal> BaseSales { get; set; }

    public virtual tblTaggingGroup tblTaggingGroup { get; set; }
}

而控制器是

public ActionResult Index()
{
    var SelectedID = Convert.ToInt32(Session["_SessionSelectGroupID"]);
    var SelectedYear = Convert.ToInt32(Session["_SessionSelectFinYear"]);
    var SelectedWeek = Convert.ToInt32(Session["_SessionSelectFinWeek"]);
    var tblTaggingGroupInstances = db.tblTaggingGroupInstances.Include(t => t.tblTaggingGroup);

    return View(tblTaggingGroupInstances.Where(t => t.tblTaggingGroupID == SelectedID && t.FinYear == SelectedYear && t.FinWeek == SelectedWeek).ToList());
}

[HttpPost]
public ActionResult Index(List<tblTaggingGroupInstance> model)
{
    foreach (var record in model)
    {
        db.Entry(record).State = EntityState.Modified;
    }
    db.SaveChanges();
    return RedirectToAction("Index");
}

在不影响回发到数据库的值的情况下更改显示的文本的最简单/最简单的方法是什么?

谢谢 标记

【问题讨论】:

  • 您指的是Nullable&lt;bool&gt; Recurring 属性吗?你想显示什么文字?
  • 是的,就是这样,我需要它说 Recurring 或 Non-Recurring,具体取决于值是 1 还是 0。
  • 它可以为空,那么当它的null 时你想显示什么?一种选择是使用带有附加 string 属性的视图模型,该属性包含文本并包含该属性的隐藏输入(但如果您想编辑它并更新显示文本,那么您将需要 javascript)
  • 其他一些使用 HtmlHelper 扩展方法和 DisplayTemplates 的选项显示在this question的答案中
  • 请更新您的问题的标题,以指定您实际需要的内容。我在您的标题中看到dropdown,但现在在您的代码中

标签: c# asp.net-mvc entity-framework html-helper editorfor


【解决方案1】:

在您的模型中,您可以为您的bool 属性创建一个对应的string (getter) 类型属性。这将始终为您提供您定义的相应字符串。即,

public Nullable<bool> Recurring { get; set; }
public string RecurringText
{ get { 
        if(Recurring.HasValue && Recurring.Value == true)
           return "Yes";
        else
           return "No";
       }
}

在您的 EditorTemplate 中,您可以这样做:

@Html.LabelFor(m => m.RecurringText)
@Html.HiddenFor(m => m.Recurring)

请注意如果此属性是可编辑的,您可以使用TextboxFor 代替LabelFor。如:

@Html.TexboxFor(m => m.RecurringText)

并且在您的JQuery 脚本标签中,您需要在保存事件时将相应的布尔值设置为隐藏的Recurring 属性。类似:

//inside click of your save button:
var inputRecurringValue = $('#ReccuringText').val();
if(inputRecurringValue.toLower() == 'yes')
{  
   $('#Recurring').val(true);
}
else
   $('#Recurring').val(false);

【讨论】:

    【解决方案2】:

    您可以将布尔值作为隐藏字段发送,并仅显示其值的文本。

    // Razor View / Editor Template    
    @{ var recurringDisplay = Model.Recurring ? "recurring" : "not recurring"; }
    
    @recurringDisplay
    @Html.HiddenFor(m => m.Recurring)
    

    正如 Stephen Muecke 所说,如果 Recurring 的值可以更改,您将需要一些 Javascript 来更新显示值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多