2012-05-29 65 views
4

我環顧了一下網絡了一段時間,但無法找到一個很好的解決方案,我的具體問題。我正在開發一款MVC3 Razor應用程序。我正在用jQuery在客戶端做一堆東西,所以在這種情況下,我需要我的輸入字段具有HTML ID屬性。MVC3 TextBoxFor與EditorFor - 與每個問題

在此特定問題中,當我使用TextBoxFor顯示貨幣(類型是十進制)時,該值呈現4位小數(我只想要2)。我把在模型屬性

[DisplayFormat(DataFormatString = "{0:n2}", ApplyFormatInEditMode = true)]

當它呈現它似乎忽略了這個「displayFormat」。我在網上看過其他帖子,確認這個問題存在與TextBoxFor html helper。

另一方面,我可以更改爲使用EditorFor html幫助器和DisplayFormat模型屬性適用於格式我的文本框值爲2個小數位。缺點是我沒有能力將HTML屬性應用到我需要用於jQuery的html助手。什麼是最好的方式來獲得兩全其美?我已經看到了一堆解決方法,但似乎必須有一個更簡單的方法來做到這一點。

作爲一個方面說明,我的具體項目需要我的大部分字段都具有html id屬性,有時還有類,因此我可以執行客戶端jQuery操作。不知道這是否意味着我應該專注於擴展EditorFor的HTML幫助器,以接受HTML屬性或不。

回答

2

DisplayFormat僅被MVC用於剃鬚刀的任何Display擴展方法中。 (如DisplayFor)不幸的是,要做你想做的事情,你必須寫一些「手工」的代碼......這是一個讓你走的例子。它基本上重現了TextBoxFor代碼,但做出了一些最有可能對生產不利的假設。請注意下面的displayText的分配,這是我們真正關心的您在DisplayFormat中設置的位置。

要調用它在你看來@Html.TextEditorFor(m => m.Value)

public static class CustomEditorFor 
{ 
    public static IHtmlString TextEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) 
    { 
     return TextEditorFor(helper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
    } 

    public static IHtmlString TextEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) 
    { 
     ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
     object value = metadata.Model; 
     string displayText = string.Format(metadata.DisplayFormatString, value); 

     string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression)); 

     TagBuilder tagBuilder = new TagBuilder("input"); 
     tagBuilder.MergeAttributes(htmlAttributes); 
     tagBuilder.MergeAttribute("type", "text"); 
     tagBuilder.MergeAttribute("name", fullName, true); 

     tagBuilder.MergeAttribute("value", displayText); 
     tagBuilder.GenerateId(fullName); 
     ModelState modelState; 
     if (helper.ViewData.ModelState.TryGetValue(fullName, out modelState)) 
     { 
      if (modelState.Errors.Count > 0) 
      { 
       tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); 
      } 
     } 

     tagBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata)); 

     return new HtmlString(tagBuilder.ToString(TagRenderMode.SelfClosing)); 

    } 
} 
0

這裏簡單的解決方案是創建自定義貨幣類型的自定義顯示和編輯模板。做這個。

public class MyModel { 
    [DataType(DataType.Currency)] 
    public decimal mycurrency {get;set;} 
} 

然後在〜/查看/共享/ EditorTemplates/Currency.cshtml(或DisplayTemplates)

@model decimal? 

@Html.TextBox("", string.Format("{0:0.00}", Model), new { whateveryourattributes="attributevalues"}) 

然後,你可以使用DisplayFor或EditorFor或什麼的。

0

我結束了使用Telerik的數字文本框控件。我確定上述兩個答案都能修正小數格式。

我仍然需要循環回模型驗證。我遇到了編輯器問題,如果HTML Helper拉動驗證模型上的數據註釋以進行驗證,而對TextBoxFor執行相同的操作則不是。但與此同時,編輯助手的缺點是沒有接受我需要jQuery的HtmlAttributes。

我已經開始使用MVC4 RC,所以我希望很多這些東西都在版本4中修復。