MVC 5 EF 6 EditorFor下拉列表更改显示的文本

MVC 5 EF 6 EditorFor Dropdown List Change Text displayed

我有一组简单的数据,从 SQL 中的 table 到 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");
}

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

谢谢 马克

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

// Razor View / Editor Template    
@{ var recurringDisplay = Model.Recurring ? "recurring" : "not recurring"; }

@recurringDisplay
@Html.HiddenFor(m => m.Recurring)

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

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

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 脚本标签中,您需要将相应的 bool 值设置为隐藏的 Recurring 属性 保存事件。类似于:

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